Java Mockito mocking方法调用实际的方法
我正在尝试使用Mockito.when以及doReturn()模拟方法createInstanceB。这总是调用实方法。 例: 我正在使用下面的内容进行导入 导入org.mockito.mockito; 导入静态org.mockito.mockito.*Java Mockito mocking方法调用实际的方法,java,junit,mockito,Java,Junit,Mockito,我正在尝试使用Mockito.when以及doReturn()模拟方法createInstanceB。这总是调用实方法。 例: 我正在使用下面的内容进行导入 导入org.mockito.mockito; 导入静态org.mockito.mockito.* Class ATest { A a; B b; @Before Public void setup{ a = A.getInstance(); b = mock(B.class); } @Test
Class ATest {
A a;
B b;
@Before
Public void setup{
a = A.getInstance();
b = mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(a.createInstanceB(any(),any()).thenreturn(b);
...
}
}
也尝试了多雷图恩(模拟)。
非常感谢在这方面提供的任何帮助。代码的问题是,它在
A
的实际实例上调用Mockito.when(),而不是mock。when()只适用于模拟对象,而不适用于真实对象
如果你需要在“真实”对象上“嘲弄”(MutcDebug)方法,考虑使用MoCito to。有关使用“间谍”的更多信息,请参阅
类似这样的东西将接近您想要的:Class ATest{
A a ;
A aSpy;
B b;
@Before
Public void setup{
a= A.getInstance();
aSpy = Mockito.spy(a);
b= mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(aSpy.createInstanceB(any(),any()).thenreturn(b);
...
}
您需要在测试代码中使用
aSpy
,而不是a
。正如stvnbrkdell建议的,如果需要使用实际实例,请使用Spy。但是,如果在示例中使用Mockito.when(),有时仍然可以调用实际方法。另一种选择是查看Mockito.doReturn()。例如,使用您的代码:Mockito.doReturn(b).when(a).createInstanceB(any(),any())
现在只返回b
,而不会调用createInstanceB
的实际方法
顺便说一句,有一节是关于这个的。请参阅“关于监视真实对象的重要问题!”下的部分。发布一个完整的再现问题的最小示例。如果没有看到您的代码,我们就无法判断您的代码为什么出错。Updated-JB nizett您发布的代码不是有效的Java代码。正如您得到的正确回答所说:您正在尝试模拟一个不是模拟对象的对象的方法。从这个意义上说,真正的答案是你应该读一本好的教程。在这种情况下,通过反复试验来学习是没有效率的。
Class ATest{
A a ;
A aSpy;
B b;
@Before
Public void setup{
a= A.getInstance();
aSpy = Mockito.spy(a);
b= mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(aSpy.createInstanceB(any(),any()).thenreturn(b);
...
}