首页 > 解决方案 > Mockito - 在When - ThenReturn 子句期间调用真实方法

问题描述

考虑以下类(使用 CDI + cuttom 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 Client。所以我做了以下事情:

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(...).thenReturn(...) 实际上调用了真正的方法.. .

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

标签: javamockito

解决方案


@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)的最佳方式。


推荐阅读