java - Mockito - 在When - ThenReturn 子句期间调用真实方法
问题描述
考虑以下类(使用 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' 为空,但我的方法正常工作(已测试它们)。
如果我将@Spy 用于A,我会得到一个NPE,因为我的Restclient 没有初始化(即使我添加了@Mock RestClient 客户端)并且when(...).thenReturn(...) 实际上调用了真正的方法.. .
即使感觉如此简单,也不知道如何解决这个问题......
解决方案
@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)的最佳方式。
推荐阅读
- pine-script - 如何克服“绘图”和“填充”功能限制
- javascript - Javascript从多个数组中查找所有重复项
- javascript - 阻止代码从 JS 中的检查元素运行?
- ffmpeg - 使用 ffmpeg 调整高清视频大小并将其裁剪为方形视频
- javascript - guild.channels.cache.array() 返回一个空数组。与 client.channels.cache.array() 相同
- prometheus - 如何使用普罗米修斯中的标签从同一个计数器中获取百分比?
- flutter - Flutter Dart 从对象列表中获取字符串列表
- python - 如何在Python中索引每行超过一个单词的输入单词
- tensorflow - 在本地 pc 上从源代码构建 tensorflow 并在远程 pc 上部署
- gmail - 如何以编程方式刷新 gmail api 的令牌?