gpt4 book ai didi

java - Mockito,如何使用真正的方法并获取值

转载 作者:行者123 更新时间:2023-12-01 22:30:10 25 4
gpt4 key购买 nike

我使用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() 方法,该方法取决于类 (ai) 的状态。

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

正如评论中所建议的,您可以使用 Spy,这是相反的方法,您使用真实对象并仅 stub 一些方法。在您的示例中,不清楚您要测试什么,但这就是 spy 的样子。

MockTest mt = Mockito.spy(new MockTest());

System.out.println(mt.getAi());
mt.increment();
System.out.println(mt.getAi());

// Output will be
// 0
// 1

然后,如果您需要 stub ,比如说 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

请考虑到,部分模拟通常是一种代码味道,除非是非常特殊的情况,例如处理难以更改的遗留代码时。

希望这有帮助。

关于java - Mockito,如何使用真正的方法并获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949137/

25 4 0
文章推荐: ios - 模态关闭时的 UISearchController 问题
文章推荐: java - 你可以使 id 动态 -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com