我正在尝试编写集成测试。我想使用本地堆栈启动模拟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");
}
}
当您使用Junit 4时,您只能使用一个@RunWith
。
这将导致您出现问题,因为您无法同时运行LocalstackTestRunner
和SpringRunner
。
有几种方法可以克服这个问题:
最小的更改是使用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 containers和spring。