Mockito,如何使用真实方法并获取值
Mockito, how to use real methods and get values
我正在使用 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 文档,如果真正的实现取决于对象的特定状态,那么您就有麻烦了。这正是你的情况,你正在部分模拟 class MockTest 然后调用方法 getAi() 这取决于 clase (ai) 的状态。
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html
正如评论中所建议的,您可以使用 Spy,这是相反的方法,您使用真实的对象并仅存根一些方法。在您的示例中,不清楚您要测试什么,但这就是间谍的样子。
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
请注意,部分模拟通常是一种代码味道,除非是非常特殊的情况,例如处理难以更改的遗留代码时。
希望这对您有所帮助。
我正在使用 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 文档,如果真正的实现取决于对象的特定状态,那么您就有麻烦了。这正是你的情况,你正在部分模拟 class MockTest 然后调用方法 getAi() 这取决于 clase (ai) 的状态。
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html
正如评论中所建议的,您可以使用 Spy,这是相反的方法,您使用真实的对象并仅存根一些方法。在您的示例中,不清楚您要测试什么,但这就是间谍的样子。
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
请注意,部分模拟通常是一种代码味道,除非是非常特殊的情况,例如处理难以更改的遗留代码时。
希望这对您有所帮助。