【发布时间】:2017-04-14 08:36:05
【问题描述】:
我有一个 Spring 服务,我想测试它对并发线程的正确性。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SerialNumberServiceTest {
@Autowired
private SerialNumberService service;
private final static int NUM_THREADS = 10;
private final static int NUM_ITERATIONS = 100;
@Test
public void testSynchronized(){
ExecutorService executor = Executors.newFixedThreadPool(10);
final Set<String> result = new HashSet<String>();
int size = 0;
for(int i = 0; i < NUM_THREADS; i++){
executor.submit(new Runnable() {
@Override
public void run() {
for (int j = 0; j < NUM_ITERATIONS; j++) {
String code = service.generateSerialNumberByModelCode("LP");
result.add(code);
}
}
});
}
assertEquals(NUM_ITERATIONS * NUM_THREADS, result.size());
}
}
我想断言生成了多少代码并检查是否有重复的代码。 但是 result 集是空的。我不知道为什么。
另一方面,如果我尝试在线程中更新 service 实例的值,我也会发现这些值没有保存。例如
public void run() {
for (int j = 0; j < NUM_ITERATIONS; j++) {
String code = service.generateSerialNumberByModelCode("LP");
service.incrValue();
result.add(code);
}
}
最后,service.getValue() 没有改变。
谁能帮我解释一下?
【问题讨论】:
标签: java spring multithreading unit-testing