首页 > 解决方案 > 如何在使用自动装配对象的测试中使用实际功能?

问题描述

在我的代码中,我模拟了一个对象:

 @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 { 中为空。

一些技巧?

谢谢

问候

标签: javatestingjunitmockito

解决方案


如果您必须使用@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 文档中阅读更多关于在此处编写集成测试的信息。它涵盖了正确运行测试所需了解的所有内容。


推荐阅读