【问题标题】:Spring integration test - AutoWiring classes without RunWith annotation (AWS localstack)Spring 集成测试 - 没有 RunWith 注释的 AutoWiring 类(AWS localstack)
【发布时间】:2020-05-18 15:12:34
【问题描述】:

我正在尝试编写集成测试。我想使用本地堆栈来启动一个模拟 AWS 服务的 docker 容器。

此代码将启动 docker 容器,但不会从我的 spring 应用程序中自动装配类。

@RunWith(LocalstackTestRunner.class)
@LocalstackDockerProperties(services = {"dynamodb","sns"})
@ActiveProfiles("test")
@SpringBootTest(classes = {TestApplication.class})
public class FlowTest {
    @Autowired
    private PublisherFactory publisherFactory;

    @Test
    public void publishMessage() {
        // publisherFactory is null here 
        Publisher publisher = publisherFactory.getInstance("test-event");
    }
}

此代码将从我的应用程序中自动装配类,但不会启动 Docker 容器

@RunWith(SpringRunner.class)
@LocalstackDockerProperties(services = {"dynamodb","sns"})
@ActiveProfiles("test")
@SpringBootTest(classes = {TestApplication.class})
public class FlowTest {
    @Autowired
    private PublisherFactory publisherFactory;

    @Test
    public void publishMessage() {
        //publisher not null here but Docker container not running
        Publisher publisher = publisherFactory.getInstance("test-event");
    }
}

【问题讨论】:

    标签: java spring amazon-web-services spring-integration localstack


    【解决方案1】:

    当您使用 Junit 4 时,您只能使用单个 @RunWith

    这会给您带来问题,因为您无法同时运行 LocalstackTestRunnerSpringRunner

    有几种方法可以解决这个问题:

    最小的变化是使用 Junit 4 class rules

    因此您的测试可以更改为如下所示

    @RunWith(LocalstackTestRunner.class)
    @LocalstackDockerProperties(services = {"dynamodb","sns"})
    @ActiveProfiles("test")
    @SpringBootTest(classes=TestApplication.class)
    public class LocalstackJunit4Test {
    
      @ClassRule
      public static final SpringClassRule springClassRule = new SpringClassRule();
    
      @Rule
      public final SpringMethodRule springMethodRule = new SpringMethodRule();
    
      @Autowired
      private PublisherFactory publisherFactory;
    
      @Test
      public void publishMessage() {
         Publisher publisher = publisherFactory.getInstance("test-event");
      }
    
    }
    
    

    此设置将设置 docker 容器和 Spring 应用程序。


    Junit 5 示例

    确保测试导入是org.junit.jupiter.api.Test 和以下

    @LocalstackDockerProperties(services = {"dynamodb","sns"})
    @ExtendWith(LocalstackDockerExtension.class)
    @ActiveProfiles("test")
    @SpringBootTest(classes=TestApplication.class)
    class LocalstackJunit5Test {
    
    
      @Autowired
      private PublisherFactory publisherFactory;
    
      @Test
      void publishMessage() {
         Publisher publisher = publisherFactory.getInstance("test-event");
      }
    
    }
    
    

    备选方案是:

    您可以通过测试容器使用 Localstack 类规则,请参阅文档here

    您可以使用 Junit 5,它允许您使用 extensions,它又可以使用 test containersspring

    【讨论】:

    • 谢谢,很好的回答。我得到了 extendsWith 注释,如果它是最干净的解决方案,我想使用这种方法,尽管当我使用 @ExtendWith(LocalstackDockerExtension.class) 时,docker 容器仍然没有启动。有什么想法吗?
    • 我为 JUnit 5 ExtendWith 添加了更新,它将启动 docker 和 Spring。
    猜你喜欢
    • 2017-04-30
    • 2017-08-04
    • 2018-03-24
    • 1970-01-01
    • 2021-06-26
    • 2019-10-08
    • 2014-05-31
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多