java - 对 AWS Spring Boot 配置文件进行单元测试 - 可能吗?

标签 java spring amazon-web-services spring-boot

我们目前正在使用 Spring Boot 连接到 Amazon SQS 的模拟本地实例。应用程序本身在运行时可以正常工作,但如果可能并且有意义的话,我们想尝试测试 SQS Config 类。

这里是配置类。当 Spring 应用程序本身运行时,所有属性都从典型的 application.properties 文件中提取。

import com.amazonaws.services.sqs.AmazonSQSAsync;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.aws.core.env.ResourceIdResolver;
import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AWSSQSConfig {
    @Value("${aws.sqs.endpoint}")
    private String AWSSqsEndpoint;

    // Producer QueueMessageTemplate
    @Bean
    public QueueMessagingTemplate queueMessagingTemplate(AmazonSQSAsync amazonSqs, ResourceIdResolver resourceIdResolver) {
        if (!AWSSqsEndpoint.isEmpty())
            amazonSqs.setEndpoint(AWSSqsEndpoint);

        return new QueueMessagingTemplate(amazonSqs, resourceIdResolver);
    }
}

这是测试类。我们试图通过 TestPropertySource 传递配置,但它们实际上似乎并没有到达 AWSSQSConfig 类。类实例中的 AWSSqsEndpoint 始终为 NULL。

import com.amazonaws.services.sqs.AmazonSQSAsync;
import com.lonewolf.formsbuilder.config.AWSSQSConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.aws.core.env.ResourceIdResolver;
import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;
import org.springframework.test.context.TestPropertySource;

import static org.junit.Assert.assertNotNull;

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
@TestPropertySource(properties = {
        "cloud.aws.region.static=us-east-1",
        "cloud.aws.credentials.accessKey=zzzzz",
        "cloud.aws.credentials.secretKey=zzzzzz",

        "aws.sqs.endpoint = http://localhost:9324",
        "aws.sqs.requestQueue = CreateSchemaRequest",
        "aws.sqs.responseQueue = CreateSchemaResponse"
})
public class AWSSQSConfigTests {
    @Mock
    private AmazonSQSAsync amazonSqs;

    @Mock
    private ResourceIdResolver resourceIdResolver;

    @Test
    public void contextLoads() {
        AWSSQSConfig config = new AWSSQSConfig();

        QueueMessagingTemplate queueMessagingTemplate = config.queueMessagingTemplate(amazonSqs, resourceIdResolver);

        assertNotNull("The response body must not be null", queueMessagingTemplate);
    }
}

这是先有鸡还是先有蛋的情况,spring 框架实际上需要先运行才能注入(inject)那些配置值?我们需要在这里进行集成测试吗?

编辑工作解决方案...

使用已接受的答案,这是我的工作测试!我能够移除我对 Spring 框架的依赖。

@RunWith(MockitoJUnitRunner.class)
public class AWSSQSConfigTests {
    @Mock
    private AmazonSQSAsync amazonSqs;

    @Mock
    private ResourceIdResolver resourceIdResolver;

    @InjectMocks
    private AWSSQSConfig config;

    @Before
    public void setup() {
        ReflectionTestUtils.setField(config, "AWSSqsEndpoint", "http://fake");
    }

    @Test
    public void contextLoads() {
        QueueMessagingTemplate queueMessagingTemplate = config.queueMessagingTemplate(amazonSqs, resourceIdResolver);

        assertNotNull("The response body must not be null", queueMessagingTemplate);
    }
}

最佳答案

您是否尝试过将 mock 注入(inject)您的类(或 Autowiring 它),然后使用 ReflectionTestUtils 设置该字段?这是 Spring 提供的一个很好的测试实用程序类,它允许您在不修改代码的情况下执行您想要的操作。 我的意思是这样的:

    @InjectMocks
    private AWSSQSConfig awssqsConfig;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(awssqsConfig, "AWSSqsEndpoint", "putYourEndpointHere");
    }

关于java - 对 AWS Spring Boot 配置文件进行单元测试 - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42260849/

相关文章:

java - 配置 Jersey 时,Spring Boot HandlerInterceptor 没有触发?

java - 尽管组件位于同一包和扫描组件中,但 Spring 未检测到该组件

amazon-web-services - 如何将查询中的所有结果获取到 aws dynamodb 表?

amazon-web-services - Cloudformation LayerVersion S3Bucket 使用参数

java - 在 Android 后台下载 Facebook 图像

java - watched文件夹重命名后怎么办?

java - 如何在Spring初始化之前启动一个类?

java - AWSParameterStore获取所有键和值

java - spring如何为Environment找到bean?

java - IOUtils.copy 第二次失败