1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.batch.test;
17
18 import java.lang.reflect.Method;
19
20 import org.springframework.batch.core.StepExecution;
21 import org.springframework.batch.core.scope.context.StepContext;
22 import org.springframework.batch.core.scope.context.StepSynchronizationManager;
23 import org.springframework.batch.item.adapter.HippyMethodInvoker;
24 import org.springframework.test.context.TestContext;
25 import org.springframework.test.context.TestExecutionListener;
26 import org.springframework.util.ReflectionUtils;
27 import org.springframework.util.ReflectionUtils.MethodCallback;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public class StepScopeTestExecutionListener implements TestExecutionListener {
67
68 private static final String STEP_EXECUTION = StepScopeTestExecutionListener.class.getName() + ".STEP_EXECUTION";
69
70
71
72
73
74
75
76
77 @Override
78 public void prepareTestInstance(TestContext testContext) throws Exception {
79 StepExecution stepExecution = getStepExecution(testContext);
80 if (stepExecution != null) {
81 testContext.setAttribute(STEP_EXECUTION, stepExecution);
82 }
83 }
84
85
86
87
88
89
90 @Override
91 public void beforeTestMethod(org.springframework.test.context.TestContext testContext) throws Exception {
92 if (testContext.hasAttribute(STEP_EXECUTION)) {
93 StepExecution stepExecution = (StepExecution) testContext.getAttribute(STEP_EXECUTION);
94 StepSynchronizationManager.register(stepExecution);
95 }
96
97 }
98
99
100
101
102
103
104 @Override
105 public void afterTestMethod(TestContext testContext) throws Exception {
106 if (testContext.hasAttribute(STEP_EXECUTION)) {
107 StepSynchronizationManager.close();
108 }
109 }
110
111
112
113
114 @Override
115 public void afterTestClass(TestContext testContext) throws Exception {
116 }
117
118
119
120
121 @Override
122 public void beforeTestClass(TestContext testContext) throws Exception {
123 }
124
125
126
127
128
129
130
131
132 protected StepExecution getStepExecution(TestContext testContext) {
133
134 Object target = testContext.getTestInstance();
135
136 ExtractorMethodCallback method = new ExtractorMethodCallback(StepExecution.class, "getStepExecution");
137 ReflectionUtils.doWithMethods(target.getClass(), method);
138 if (method.getName() != null) {
139 HippyMethodInvoker invoker = new HippyMethodInvoker();
140 invoker.setTargetObject(target);
141 invoker.setTargetMethod(method.getName());
142 try {
143 invoker.prepare();
144 return (StepExecution) invoker.invoke();
145 }
146 catch (Exception e) {
147 throw new IllegalArgumentException("Could not create step execution from method: " + method.getName(),
148 e);
149 }
150 }
151
152 return MetaDataInstanceFactory.createStepExecution();
153 }
154
155
156
157
158
159 private final class ExtractorMethodCallback implements MethodCallback {
160 private String preferredName;
161
162 private final Class<?> preferredType;
163
164 private Method result;
165
166 public ExtractorMethodCallback(Class<?> preferredType, String preferredName) {
167 super();
168 this.preferredType = preferredType;
169 this.preferredName = preferredName;
170 }
171
172 public String getName() {
173 return result == null ? null : result.getName();
174 }
175
176 @Override
177 public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
178 Class<?> type = method.getReturnType();
179 if (preferredType.isAssignableFrom(type)) {
180 if (result == null || method.getName().equals(preferredName)) {
181 result = method;
182 }
183 }
184 }
185 }
186
187 }