考虑以下类(使用 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(的最佳方法。