【问题标题】:Mockito - Calling real methods during When - ThenReturn clauseMockito - 在When - ThenReturn 子句期间调用真实方法
【发布时间】:2019-07-05 06:59:57
【问题描述】:

考虑以下类(使用 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' 为空,但我的方法正常工作(已对其进行测试)。

如果我对 A 使用 @Spy,我会得到一个 NPE,因为我的 Restclient 没有初始化(即使我添加了@Mock RestClient 客户端)并且 when(...).thenReturn(...) 实际上调用了真正的方法...

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

【问题讨论】:

  • "由于某种原因,这个 JUnit 4 + Mockito 2.18 测试失败,因为 'c' 为空" -- 发生这种情况是因为 a 是一个模拟并且您没有设置它来调用真正的方法.因此,当您执行 a.init("123"); 时,您会得到默认的模拟行为

标签: java mockito


【解决方案1】:

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

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

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

public void test_a() {
  ...

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2017-07-21
      • 2016-01-12
      • 2021-11-28
      相关资源
      最近更新 更多