Spring 集成测试 - AutoWiring 类 没有 RunWith 注释 (AWS localstack)
Spring integration test - AutoWiring classes without RunWith annotation (AWS 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");
}
}
此代码将从我的应用程序自动装配 类,但不会启动 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 应用程序。
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 class 规则,请参阅文档 here。
或
您可以使用 Junit 5,它允许您使用 extensions which again can use test containers and spring。
我正在尝试编写集成测试。我想使用本地堆栈启动一个模拟 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 应用程序。
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 class 规则,请参阅文档 here。
或
您可以使用 Junit 5,它允许您使用 extensions which again can use test containers and spring。