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

时间:2019-02-11 17:54:01

标签: java mockito

考虑以下类(使用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 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(...)实际上调用了方法...

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

2 个答案:

答案 0 :(得分:2)

结合使用select column from table where upper(column) = lower(column); @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

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

答案 1 :(得分:0)

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

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

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

public void test_a() {
  ...

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