【发布时间】: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");时,您会得到默认的模拟行为