以下方法在一个单独的线程中同步调用serveThis()
的{{1}}方法和service
方法,即异步调用:
serveThat()
我想在单元测试中验证public void doSomething() {
service.serveThis();
new Thread(() -> service.serveThat()).start();
}
将根据规范异步执行,它不能同步执行。
所以,我想要防止以后某人只是删除开始这样的新线程:
service.serveThat()
答案 0 :(得分:1)
可以在代码中的任何位置获得Thread.currentThread()
,因此您可以编写类似这样的内容并根据它创建断言(如果您没有{{1,可以通过Mockito以不同的方式实现此目的) }}):
YourInterface
单元测试可能是这样的,但根据用例可能需要额外的断言:
public class ThreadChecker implements YourInterface {
volatile Thread serveThisThread;
volatile Thread serveThatThread;
public void serveThis() {
serveThisThread = Thread.currentThread();
}
public void serveThat() {
serveThatThread = Thread.currentThread();
}
}
答案 1 :(得分:0)
我想验证
service.serveThat()
是否会异步执行。
会的。语法是这样说的。不要测试平台。
答案 2 :(得分:-1)
为了达到这个目的,我使用了Mockito:
public void doSomething() {
service.serveThis();
// This synchronous execution must cause the test to fail
service.serveThat();
}
现在,如果有人修改Thread threadServeThatRunsOn;
@Test
public void serveThatWillBeExecutedAsynchronously() throws Exception {
doAnswer(invocation -> {
threadServeThatRunsOn = Thread.currentThread();
return null;
}).when(mockService).serveThat();
testObject.doSomething();
verify(mockService, timeout(200)).serveThat();
assertNotEquals(threadServeThatRunsOn, Thread.currentThread());
}
以便doSomething()
同步运行,则此测试将失败。