Java Mockito mocking方法调用实际的方法

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

我正在尝试使用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
  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);
 ...
}