我正在尝试使用MongoDb和RabbitMQ测试容器测试Micronaut应用程序。application.yml的配置如下
mongodb:
uri: "mongodb://${MONGO_HOST:localhost}:${MONGO_PORT:27017}"
database: "FeteBird-Product"我有以下配置代码
@Introspected
@ConfigurationProperties("mongodb")
public record MongodbConfiguration(@NotNull String uri, @NotNull String database) {
}在存储库中。存储库位于另一个项目中
@Singleton
public record Repository(MongoClient mongoClient, MongodbConfiguration mongodbConfiguration) implements IRepository {
@Override
public <T> MongoCollection<T> getCollection(String collectionName, Class<T> typeParameterClass) {
return mongoClient
.getDatabase(mongodbConfiguration.database())
.getCollection(collectionName, typeParameterClass);
}
}mongodbConfiguration.uri始终为mongodb://localhost:27017,但是在JUnit测试中,我使用了以下代码
@Testcontainers
public abstract class TestContainerFixture {
public static final GenericContainer mongoDBContainer;
public static final GenericContainer rabbitMQContainer;
static {
mongoDBContainer = new GenericContainer(DockerImageName.parse("mongo:4.0.10")).withExposedPorts(27017);
rabbitMQContainer = new GenericContainer(DockerImageName.parse("rabbitmq:3-management-alpine")).withExposedPorts(5672);
mongoDBContainer.start();
rabbitMQContainer.start();
}
}
@MicronautTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class DiscountDeleteListenerTest extends TestContainerFixture {
private ApplicationContext applicationContext;
@BeforeAll
@DisplayName("Initial application setup")
void initialApplicationSetup() {
applicationContext = ApplicationContext.run(
Map.of("mongodb.uri",
String.format("mongodb://%s:%s", mongoDBContainer.getContainerIpAddress(), mongoDBContainer.getMappedPort(27017)),
"rabbitmq.uri",
String.format("amqp://%s:%s", rabbitMQContainer.getContainerIpAddress(), rabbitMQContainer.getMappedPort(5672)))
, "test"
);
iDiscountProducer = applicationContext.getBean(IDiscountProducer.class);
}
}下面的代码很好用
String.format("mongodb://%s:%s", mongoDBContainer.getContainerIpAddress(), mongoDBContainer.getMappedPort(27017)) 这会将URL指定为mongodb://localhost:57032。
现在,当我完成所有单元测试并检查数据库时,它将插入、更新和删除本地docker实例,即端口27017
群集的主机仍指向27017

从这里得到了一些想法,https://github.com/micronaut-projects/micronaut-test/issues/32,但仍然不确定如何做到这一点。
发布于 2021-08-15 13:41:33
我们不能同时使用MicronautTest和TestContainer。当您使用MicronautTest注释测试时,它会在调用初始化方法之前唤醒应用程序
所以删除@MicronautTest就可以解决这个问题
https://stackoverflow.com/questions/68788506
复制相似问题