Mockito可以进行模拟拦截的拦截器调用吗?还是可以的拦截器?

时间:2020-04-01 10:02:01

标签: mockito

我需要编写一个单元测试,以显示当服务已在使用中时,锁将使线程脱离代码块。 (我意识到一般情况下不可能为锁编写单元测试,我只需要提供完整性检查即可。)

测试套件已经严重依赖于模拟,因此计划是在受控代码块内拦截二次调用,并使用拦截再次调用服务,就像从另一个线程进行调用一样。如下:

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调用模拟。有办法解决这个问题吗?

0 个答案:

没有答案