java - 如何在使用自动装配对象的测试中使用实际功能?
问题描述
在我的代码中,我模拟了一个对象:
@Mock
ElasticService elasticServiceMock;
@Autowired
ElasticConfiguration elasticConfiguration;
我尝试做一个测试:
@Test
public void measureChannelProcessor() throws IOException {
when(elasticServiceMock.insert(anyString(),anyString())).thenAnswer(invocation -> {
String index = (String) invocation.getArguments()[0];
String message = (String) invocation.getArguments()[1];
String requestUri = new StringBuilder()
.append(elasticConfiguration.baseRequestBuilder(index))
.toString();
}
当我调用 elasticConfiguration.baseRequestBuilder(index) 我有空值。
elasticConfiguration 的真正类是这样的:
@Configuration
public class ElasticConfiguration {
@Autowired ElasticParameters elasticParameters;
public String baseRequestBuilder(String index){
String toRet = new StringBuilder()
.append(elasticParameters.getProtocol())
.append("://")
.append(elasticParameters.getHost())
.append(":")
.append(elasticParameters.getPort())
.append("/")
.append(index)
.append("/")
.append(elasticParameters.getType())
.append("/")
.toString();
return toRet;
}
特别是我想要简单的真实类 elasticConfiguration 但是
@Autowired
ElasticConfiguration elasticConfiguration;
不工作!我有 java.lang.NullPointerException。
问题是如何在测试中使用对象?
另外,如果我使用@Mock ElasticConfiguration elasticConfiguration;
我有同样的错误,但在调试时我认为@Autowired ElasticParameters
弹性参数;在公共类 ElasticConfiguration { 中为空。
一些技巧?
谢谢
问候
解决方案
如果您必须使用@autowire
该对象,那么您需要某种形式的IOC 容器,对于 Java,这可能是 Spring。
通常,为了让 Spring 根据您的测试工作并在正确的时间自动装配您的 bean,您将需要正确的注释,以告诉 Spring 在您执行测试套件时要做什么。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = ElasticConfiguration.class)
ElasticParameters
您还应该在上述语句中包含包含 bean 定义的任何配置类。所以它看起来像:
@ContextConfiguration(classes = {ElasticConfiguration.class, OtherConfiguration.class})
此外,如果您使用组件扫描作为自动 bean 配置的一种方式,那么您只需声明一个附加注释:
@ComponentScan(basePackages = "com.your.package.with.beans")
通常,当我们使用 IOC 容器来运行我们的测试时,它们是测试金字塔中的集成测试或更高级别的测试。单元测试不需要它。
我建议您从 Spring 文档中阅读更多关于在此处编写集成测试的信息。它涵盖了正确运行测试所需了解的所有内容。
推荐阅读
- php - 将 PHP 框架从一台主机移动到另一台主机,生成未知记录属性/相关组件错误
- gcc - 如何让 GCC 像 ICC 一样生成向量指令?
- c# - 将 After/Before 插入已排序的 LinkedList 大 O 复杂度
- xmpp - 使用 smack 上传 xmpp 文件
- javascript - 理解 Promise 和 Await
- sql - MS SQL 将 max()-1 添加到 qyery
- winapi - 为什么只有 1 个进程的 Minidump 文件内容错误?
- image - 如何在 Drupal 8 中显示没有标题的图像?
- c++ - C++ 链表——读入文件并根据数字对其进行排序
- javascript - 从一组坐标中找到“直接”最近的坐标