Mockito,如何使用真实方法并获取值



我正在使用mockito进行测试,因此我希望模拟在其AtomicIntegerField上执行增量,这是一个简化的代码。

public class MockTest {
    private AtomicInteger ai = new AtomicInteger( 0 );
    public int getAi(){
    return ai.get();
    }
    public void increment() {
    ai.getAndIncrement();
    }
    public static void main( String[] args ) {
    MockTest mt = Mockito.mock( MockTest.class, Mockito.RETURNS_DEEP_STUBS );
    Mockito.when(mt.getAi()).thenCallRealMethod();
    Mockito.doCallRealMethod().when(mt).increment();
    System.out.println(mt.getAi());
    mt.increment();
    System.out.println(mt.getAi());
    }
}

我尝试了CallRealMethod,但是在执行get时我得到了NullPointerException。我还阅读了有关使用 Answer 对象的信息,但对使用的参数不太确定。

从 Mockito 文档中,如果真正的实现取决于对象的特定状态,那么您就有麻烦了。这正是您的情况,您正在部分模拟类 MockTest,然后调用方法getAi(),这取决于 clase (ai) 的状态。

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html

正如评论中所建议的,您可以使用间谍,这是相反的方法,您使用真实对象并仅存根一些方法。在您的示例中,不清楚您要测试的内容,但这就是间谍的样子。

MockTest mt = Mockito.spy(new MockTest());
System.out.println(mt.getAi());
mt.increment();
System.out.println(mt.getAi());
// Output will be
// 0
// 1

然后,如果您需要存根,比方说,mt.getAi()方法,您可以这样做。

MockTest mt = Mockito.spy(new MockTest());
Mockito.when(mt.getAi()).thenReturn(100);
System.out.println(mt.getAi());
mt.increment();
System.out.println(mt.getAi());
// Output will be
// 100
// 100

请注意,部分模拟通常是一种代码异味,除非在非常特殊的情况下,例如在处理难以更改的遗留代码时。

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新