Spring 集成测试 - 没有 RunWith 注释的 AutoWiring 类(AWS localstack)

Ano*_*ias 0 java spring spring-integration amazon-web-services localstack

我正在尝试编写集成测试。我想使用本地堆栈来启动一个模拟 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码将从我的应用程序自动装配类,但不会启动 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Blu*_*urr 5

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

这会导致您出现问题,因为您不能同时运行LocalstackTestRunnerSpringRunner

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

最小的更改是使用 Junit 4类规则

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

@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");
  }

}

Run Code Online (Sandbox Code Playgroud)

此设置将设置 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");
  }

}

Run Code Online (Sandbox Code Playgroud)

替代选项是:

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

或者

您可以使用 Junit 5,它允许您使用可以再次使用测试容器spring 的扩展