Java Mockito-在When-ThenReturn子句期间调用实方法
考虑以下类(使用CDI+cutstom Restclient) 我想模拟createB(token)方法,因为我不想测试Rest客户机。因此,我做了以下工作:Java Mockito-在When-ThenReturn子句期间调用实方法,java,mockito,Java,Mockito,考虑以下类(使用CDI+cutstom Restclient) 我想模拟createB(token)方法,因为我不想测试Rest客户机。因此,我做了以下工作: public class TestA { @Mock A a; @Test public void testA() { when (a.createB("123")).thenReturn("FakeB"); Object c = a.init("123
public class TestA {
@Mock
A a;
@Test
public void testA() {
when (a.createB("123")).thenReturn("FakeB");
Object c = a.init("123");
assertNotNull(c); // Fails
}
}
由于某种原因,JUnit4+Mockito 2.18测试失败,因为“c”为null,但我的方法工作正常(已经测试过) 如果我将@Spy用于,我会得到一个NPE,因为我的Restclient没有初始化(即使我添加了@Mock Restclient客户端)和when(…)
即使感觉很简单,也不知道如何修复此问题…将
@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)的最佳方式。将
@Mock
与@injectmock
结合使用
@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)的最佳方法。如果要避免在存根期间调用方法,请使用以下符号:
doXxx(...).when(spyObject).method();
因此,在您的情况下,这将起作用:
public void test_a() {
...
doReturn("FakeB").when(restClient).getB("token"));
assertNotNull(a.init("token"))
}
如果要避免在存根期间调用方法,请使用以下符号:
doXxx(...).when(spyObject).method();
因此,在您的情况下,这将起作用:
public void test_a() {
...
doReturn("FakeB").when(restClient).getB("token"));
assertNotNull(a.init("token"))
}
“由于某种原因,JUnit 4+Mockito 2.18测试失败,因为'c'为null”--这是因为
a
是一个模拟,而您尚未将其设置为调用real方法。因此,当您执行a.init(“123”)时,会得到默认的模拟行为代码>“由于某种原因,JUnit 4+Mockito 2.18测试失败,因为'c'为null”--这是因为a
是一个模拟,而您尚未将其设置为调用实际方法。因此,当您执行a.init(“123”)时,会得到默认的模拟行为代码>