Spring集成测试-不带RunWith注释的自动装配类(AWS localstack)

问题描述 投票:0回答:1

我正在尝试编写集成测试。我想使用本地堆栈启动模拟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个回答
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应用程序。


替代选项是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.