我需要编写一个单元测试,以显示当服务已在使用中时,锁将使线程脱离代码块。 (我意识到一般情况下不可能为锁编写单元测试,我只需要提供完整性检查即可。)
测试套件已经严重依赖于模拟,因此计划是在受控代码块内拦截二次调用,并使用拦截再次调用服务,就像从另一个线程进行调用一样。如下:
public class MyService {
private AtomicBoolean isServiceRunning = new AtomicBoolean(false);
public void runServiceIfNotAlreadyRunning() {
if (!isServiceRunning.compareAndSet(false, true)) return;
try {
anotherService.doSomethingElse();
} finally {
int result = isServiceRunning.set(false);
}
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTests {
@Mock
private AnotherService anotherService;
@InjectMocks
private MyService myService;
@Test
public void testServiceDoesNotExecuteOrBlockWhenAlreadyRunning() {
myService.runServiceIfNotAlreadyRunning();
doAnswer(invocation -> {
myService.doSomething();
return 5;
}).when(anotherService.doSomethingElse());
// verify() ...
}
}
但是,此代码会产生存根错误:
org.mockito.exceptions.misusing.UnfinishedStubbingException: 在此处检测到未完成的存根: ->在“ doAnswer行” )
例如thenReturn()可能会丢失。 正确存根的示例: ...
可能是因为Mockito不支持从doAnswer调用模拟。有办法解决这个问题吗?