java - 如何使用 mockito 模拟 @Value 字段
问题描述
我正在尝试测试一个方法,但是当我的测试方法调用实际方法时,由于存在@Value 字段,实际方法总是接收@Value 字段下定义的值,即null。您可以查看以下实际方法和测试方法的代码:
实际方法
public class IndexService {
@Value("${elasticsearch.index}")
private String index;
public boolean index(String id, String json, String index) {
try {
createIndex();
return true;
} catch (IOException e) {
log.warn("Exception in indexing data {}", e.getMessage());
}
return false;
}
private void createIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest(index);
}
}
下面是我的测试方法:
@Test
public void IndexServiceIndex() throws IOException {
CreateIndexRequest request1 = new CreateIndexRequest(index);
request1.source("{\"name\":true}",XContentType.JSON);
Mockito.when(indicesClient.create(request1,RequestOptions.DEFAULT))
.thenReturn(createIndexResponse);
Boolean indexser = indexService.index("65","{\"name\":molly}","1");
}
下面是CreateIndexRequest class
方法:
public CreateIndexRequest(String index) {
if (index == null) {
throw new IllegalArgumentException("The index name cannot be null.");
} else {
this.index = index;
}
}
发生的事情是,当我的测试方法调用实际方法indexService.index("65","{\"name\":molly}","1");
时,控制转到actual method
,私有方法createIndex
正在注入index
上面定义为 的值 @Value("${elasticsearch.index}") private String index;
。因此在 中 CreateIndexRequest method
,它总是评估为 null 并抛出异常IllegalArgumentException("The index name cannot be null.")
。
我尝试使用,但我的项目中没有ReflectionTestUtils.setField
所需的依赖项。org.springframework.test.util.ReflectionTestUtils
还有其他方法可以模拟@Value 字段吗?
解决方案
你根本不知道。通常不鼓励使用字段注入,因为它使测试代码变得更加复杂。要测试您尝试测试的任何内容,请使用
- 构造函数注入 - 您可以在构造函数参数上 @Value,并且可以通过构造函数放置测试值
- setter injection - 使用 @Value 注释 setter 方法。它在容器中的工作方式完全相同,如何在测试中使用它是显而易见的
- 使用@TestProperties - 但这将修复整个测试类的值
- 使用反射——这甚至可以让你改变最终字段,但是如果涉及到 AOP 和代理,这可能不会简单地工作
可能还有很多其他人。我认为1和2是最可行的方法。
推荐阅读
- session - 使用堆跟踪会话时间
- android - 如何创建 .xapk 文件?我可以从 .apk 和 .obb 文件中制作它吗?
- python - 在同一个列表中减去两次以找到持续时间
- regex - 一个捕获组中的正则表达式条件匹配
- node-sass - Github-Actions 中的 Node-sass 绑定问题
- node.js - 共享主机上的节点 JS 服务器 - 在使用 .htaccess 的特定端口上
- javascript - 在javascript中,如果条件是returng false?
- javascript - 在 php laravel web 应用程序中突出显示导航栏上的当前页面
- wpf - 如何使用 MahApps 在所有应用程序窗口上设置 Windows 10 标题栏按钮样式
- amazon-web-services - EC2/ECS 跨账户无服务器部署