Mockito - 在 When - thenReturn 子句期间调用实数方法



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

public class A {
 @Inject
 Restclient client;
 public Object init(String token) {
    String b = createB(token);
    return c(b);
 }
 public String createB(String token)
    return client.getB(token);
 }
 public Object c(String b) {
   return new C(b);
 }
}

我想模拟方法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
     }
}

由于某种原因,此 JUnit 4 + Mockito 2.18 测试失败,因为"c"为空,但我的方法正常工作(已对其进行测试(。

如果我使用 @Spy 表示 A,我会得到一个 NPE,因为我的 Restclient 没有初始化(即使我添加了@Mock RestClient 客户端(和 when(...(。那么Return(...(实际上调用了真正的方法...

不知道如何解决这个问题,即使感觉如此简单......

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

doXxx(...).when(spyObject).method();

因此,在您的情况下,这将起作用:

public void test_a() {
  ...
  doReturn("FakeB").when(restClient).getB("token"));
  assertNotNull(a.init("token"))
}

@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(的最佳方法。

最新更新