|
19 | 19 | import static org.junit.Assert.assertEquals;
|
20 | 20 | import static org.mockito.Mockito.mock;
|
21 | 21 |
|
22 |
| -import java.lang.reflect.Constructor; |
23 |
| -import java.lang.reflect.Field; |
24 |
| -import org.junit.jupiter.api.BeforeEach; |
25 | 22 | import org.junit.jupiter.api.Test;
|
| 23 | +import org.junit.platform.commons.util.ReflectionUtils; |
26 | 24 | import org.springframework.batch.core.repository.JobRepository;
|
| 25 | +import org.springframework.batch.core.step.tasklet.TaskletStep; |
27 | 26 | import org.springframework.batch.item.ItemProcessor;
|
28 | 27 | import org.springframework.batch.item.ItemReader;
|
29 | 28 | import org.springframework.batch.item.ItemWriter;
|
| 29 | +import org.springframework.batch.repeat.support.RepeatTemplate; |
30 | 30 | import org.springframework.core.task.SimpleAsyncTaskExecutor;
|
31 |
| -import org.springframework.core.task.TaskExecutor; |
| 31 | +import org.springframework.transaction.PlatformTransactionManager; |
32 | 32 |
|
33 | 33 | /**
|
34 | 34 | * Test cases for verifying the {@link AbstractTaskletStepBuilder} and faultTolerant() functionality.
|
35 | 35 | *
|
| 36 | + * @author Jérôme Navez |
36 | 37 | * @author Ilpyo Yang
|
37 | 38 | */
|
38 | 39 |
|
39 | 40 | class AbstractTaskletStepBuilderTests {
|
| 41 | + private final PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class); |
40 | 42 | private final JobRepository jobRepository = mock(JobRepository.class);
|
41 |
| - private final int chunkSize = 10; |
42 | 43 | private final ItemReader itemReader = mock(ItemReader.class);
|
43 | 44 | private final ItemProcessor itemProcessor = mock(ItemProcessor.class);
|
44 | 45 | private final ItemWriter itemWriter = mock(ItemWriter.class);
|
45 |
| - private final SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(); |
46 |
| - SimpleStepBuilder simpleStepBuilder; |
47 |
| - |
48 |
| - private <T> T accessPrivateField(Object o, String fieldName) throws ReflectiveOperationException { |
49 |
| - Field field = o.getClass().getDeclaredField(fieldName); |
50 |
| - field.setAccessible(true); |
51 |
| - return (T) field.get(o); |
52 |
| - } |
53 | 46 |
|
54 |
| - private <T> T accessSuperClassPrivateField(Object o, String fieldName) throws ReflectiveOperationException { |
55 |
| - Field field = o.getClass().getSuperclass().getDeclaredField(fieldName); |
56 |
| - field.setAccessible(true); |
57 |
| - return (T) field.get(o); |
58 |
| - } |
59 |
| - |
60 |
| - @BeforeEach |
61 |
| - void set(){ |
62 |
| - StepBuilderHelper stepBuilderHelper = new StepBuilderHelper("test", jobRepository) { |
63 |
| - @Override |
64 |
| - protected StepBuilderHelper self() { |
65 |
| - return null; |
66 |
| - } |
67 |
| - }; |
68 |
| - simpleStepBuilder = new SimpleStepBuilder(stepBuilderHelper); |
69 |
| - simpleStepBuilder.chunk(chunkSize); |
70 |
| - simpleStepBuilder.reader(itemReader); |
71 |
| - simpleStepBuilder.processor(itemProcessor); |
72 |
| - simpleStepBuilder.writer(itemWriter); |
73 |
| - } |
| 47 | + private final SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(); |
74 | 48 |
|
75 | 49 | @Test
|
76 |
| - void copyConstractorTest() throws ReflectiveOperationException { |
77 |
| - Constructor<SimpleStepBuilder> constructor = SimpleStepBuilder.class.getDeclaredConstructor(SimpleStepBuilder.class); |
78 |
| - constructor.setAccessible(true); |
79 |
| - SimpleStepBuilder copySimpleStepBuilder = constructor.newInstance(simpleStepBuilder); |
80 |
| - |
81 |
| - int copyChunkSize = accessPrivateField(copySimpleStepBuilder, "chunkSize"); |
82 |
| - ItemReader copyItemReader = accessPrivateField(copySimpleStepBuilder, "reader"); |
83 |
| - ItemProcessor copyItemProcessor = accessPrivateField(copySimpleStepBuilder, "processor"); |
84 |
| - ItemWriter copyItemWriter = accessPrivateField(copySimpleStepBuilder, "writer"); |
| 50 | + void testCopyConstractorFaultTolerant() { |
| 51 | + TaskletStep step1 = new StepBuilder("step-name", jobRepository) |
| 52 | + .chunk(10, transactionManager) |
| 53 | + .reader(itemReader) |
| 54 | + .processor(itemProcessor) |
| 55 | + .writer(itemWriter) |
| 56 | + .faultTolerant() |
| 57 | + .taskExecutor(taskExecutor) |
| 58 | + .build(); |
85 | 59 |
|
86 |
| - assertEquals(chunkSize, copyChunkSize); |
87 |
| - assertEquals(itemReader, copyItemReader); |
88 |
| - assertEquals(itemProcessor, copyItemProcessor); |
89 |
| - assertEquals(itemWriter, copyItemWriter); |
90 |
| - } |
91 |
| - |
92 |
| - @Test |
93 |
| - void faultTolerantMethodTest() throws ReflectiveOperationException { |
94 |
| - simpleStepBuilder.taskExecutor(taskExecutor); // The task executor is set before faultTolerant() |
95 |
| - simpleStepBuilder.faultTolerant(); |
| 60 | + TaskletStep step2 = new StepBuilder("step-name", jobRepository) |
| 61 | + .chunk(10, transactionManager) |
| 62 | + .taskExecutor(taskExecutor) |
| 63 | + .reader(itemReader) |
| 64 | + .processor(itemProcessor) |
| 65 | + .writer(itemWriter) |
| 66 | + .faultTolerant() |
| 67 | + .build(); |
96 | 68 |
|
97 |
| - int afterChunkSize = accessPrivateField(simpleStepBuilder, "chunkSize"); |
98 |
| - ItemReader afterItemReader = accessPrivateField(simpleStepBuilder, "reader"); |
99 |
| - ItemProcessor afterItemProcessor = accessPrivateField(simpleStepBuilder, "processor"); |
100 |
| - ItemWriter afterItemWriter = accessPrivateField(simpleStepBuilder, "writer"); |
101 |
| - TaskExecutor afterTaskExecutor = accessSuperClassPrivateField(simpleStepBuilder, "taskExecutor"); |
| 69 | + RepeatTemplate stepOperations1 = (RepeatTemplate) ReflectionUtils |
| 70 | + .readFieldValue(TaskletStep.class, "stepOperations", step1).get(); |
| 71 | + RepeatTemplate stepOperations2 = (RepeatTemplate) ReflectionUtils |
| 72 | + .readFieldValue(TaskletStep.class, "stepOperations", step2).get(); |
102 | 73 |
|
103 |
| - assertEquals(chunkSize, afterChunkSize); |
104 |
| - assertEquals(itemReader, afterItemReader); |
105 |
| - assertEquals(itemProcessor, afterItemProcessor); |
106 |
| - assertEquals(itemWriter, afterItemWriter); |
107 |
| - assertEquals(taskExecutor, afterTaskExecutor); |
| 74 | + assertEquals(stepOperations1.getClass(), stepOperations2.getClass()); |
108 | 75 | }
|
109 | 76 | }
|
0 commit comments