在我的单元测试中,我需要模拟一个接口(interface),该接口(interface)的不同方法之间具有nextItem()isEmpty()方法:

public interface MyQueue {
    Item nextItem();
    boolean isEmpty();
    //other methods
    ...
}

我对模拟的要求是,isEmpty()最初应返回false,但在调用nextItem()之后,isEmpty()应返回true。因此,我 mock 一个项目的队列。
  • 用mockito实现这种模拟的最简单方法是什么?
  • 我是否可以实现其他要求:第二次,第三次调用nextItem()等会导致特定类型的异常?

  • P.S.由于其中的其他方法,我不想为测试提供接口(interface)的完整实现,从而导致难以理解和冗长的代码。

    最佳答案

    您可以使用thenAnswer()来实现这一点,Mockito文档中的一项功能引起争议:

    另一个有争议的功能最初并未包含在Mockito中。我们建议仅对toReturn()或toThrow()使用简单的 stub 。这两个应该足以测试/测试驱动任何干净简单的代码。

    这是答案:

    private boolean called = false;
    
    when(mock.nextItem()).thenAnswer(new Answer() {
     Object answer(InvocationOnMock invocation) {
         called = true;
         return item;
     }
    when(mock.isEmpty()).thenAnswer(new Answer() {
     Object answer(InvocationOnMock invocation) {
         return called;
     }
    });
    

    09-10 09:35