考虑以下类(使用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(...)实际上调用了方法...
即使感觉很简单也不知道如何解决此问题...
答案 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"))
}