Java Mockito-在When-ThenReturn子句期间调用实方法

Java Mockito-在When-ThenReturn子句期间调用实方法,java,mockito,Java,Mockito,考虑以下类(使用CDI+cutstom Restclient) 我想模拟createB(token)方法,因为我不想测试Rest客户机。因此,我做了以下工作: public class TestA { @Mock A a; @Test public void testA() { when (a.createB("123")).thenReturn("FakeB"); Object c = a.init("123

考虑以下类(使用CDI+cutstom Restclient)

我想模拟createB(token)方法,因为我不想测试Rest客户机。因此,我做了以下工作:

public class TestA {

     @Mock
     A a;

     @Test
     public void testA() {
          when (a.createB("123")).thenReturn("FakeB");

          Object c = a.init("123");
         assertNotNull(c); // Fails
     }
}

由于某种原因,JUnit4+Mockito 2.18测试失败,因为“c”为null,但我的方法工作正常(已经测试过)

如果我将@Spy用于,我会得到一个NPE,因为我的Restclient没有初始化(即使我添加了@Mock Restclient客户端)和when(…)


即使感觉很简单,也不知道如何修复此问题…

@Mock
@InjectMocks
结合使用

@RunWith(MockitoJUnitRunner.class)
public class TestA {
   @Mock
   RestClient restClient;

   @InjectMocks
   A a;

   public void test_a() {
      ...

      when(restClient.getB("token")).thenReturn("FakeB")
      assertNotNull(a.init("token"))
   }
}
但是,您必须允许您的
A
类注入
RestClient
,例如

public class A {
   final Restclient restClient;

   @Inject
   public A(final RestClient restClient) {
      this.restClient = restClient;
   }

...

老实说,这是处理依赖关系(并使用CDI)的最佳方式。

@Mock
@injectmock
结合使用

@RunWith(MockitoJUnitRunner.class)
public class TestA {
   @Mock
   RestClient restClient;

   @InjectMocks
   A a;

   public void test_a() {
      ...

      when(restClient.getB("token")).thenReturn("FakeB")
      assertNotNull(a.init("token"))
   }
}
但是,您必须允许您的
A
类注入
RestClient
,例如

public class A {
   final Restclient restClient;

   @Inject
   public A(final RestClient restClient) {
      this.restClient = restClient;
   }

...

老实说,这是处理依赖关系(并使用CDI)的最佳方法。

如果要避免在存根期间调用方法,请使用以下符号:

doXxx(...).when(spyObject).method();
因此,在您的情况下,这将起作用:

public void test_a() {
  ...

  doReturn("FakeB").when(restClient).getB("token"));
  assertNotNull(a.init("token"))
}

如果要避免在存根期间调用方法,请使用以下符号:

doXxx(...).when(spyObject).method();
因此,在您的情况下,这将起作用:

public void test_a() {
  ...

  doReturn("FakeB").when(restClient).getB("token"));
  assertNotNull(a.init("token"))
}

“由于某种原因,JUnit 4+Mockito 2.18测试失败,因为'c'为null”--这是因为
a
是一个模拟,而您尚未将其设置为调用real方法。因此,当您执行
a.init(“123”)时,会得到默认的模拟行为“由于某种原因,JUnit 4+Mockito 2.18测试失败,因为'c'为null”--这是因为
a
是一个模拟,而您尚未将其设置为调用实际方法。因此,当您执行
a.init(“123”)时,会得到默认的模拟行为