我有一个由一个运行测试代码的线程和另一个运行被测系统的线程组成的测试。SuT包含一些在测试线程中配置的模拟。
我的行为测试是:它在我的本地机器上做了它应该做的事情。在我们的构建服务器上却没有。就我所调试的来说,问题是,这个mock的行为不像配置的那样。
因此,在我看来,我的配置从测试线程(在某些情况下)没有传播到sut线程。
这会是问题所在吗?Mockito在这样的用例中不是线程安全的吗?这里有一些示例代码,在我的机器上工作,(不幸的是)也在我们的构建服务器上工作。
@Test
public void testConcurrency() throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(1);
MyService serviceMock = mock(MyService.class);
MyApplication app = new MyApplication(serviceMock);
Future<String> future = executor.submit(app);
when(serviceMock.call()).thenThrow(new RuntimeException("expected exception"));
String result = future.get(1, TimeUnit.SECONDS);
assertNotNull(result);
}
public class MyApplication implements Callable<String> {
private final MyService myService;
public MyApplication(MyService myService) {
super();
this.myService = myService;
}
@Override
public String call() throws Exception {
try {
while(true) {
myService.call();
}
} catch (Exception e) {
return "42";
}
}
}
public static interface MyService {
String call();
}
1条答案
按热度按时间k5hmc34c1#
我遇到过一个问题,mock的行为就像它没有被正确配置一样。所以当在其他线程中调用mock对象的stubed方法时,拦截器没有被调用。我知道当在其他线程中访问mock时,Mockito重置了我的stubs。尝试使用以下代码。
如果你在一行中有很多测试,这可能会导致问题,但我不确定。如果你有一个测试,它会“传播”(不重置)你的模拟行为(存根)到(在)另一个线程。