Для интеграционных тестов я использую de.flapdoodle.embed.mongo
с последней версией 2.2.0
. У меня две проблемы:
Проблема 1:
Получение сокета или время ожидания соединения исключения при выполнении комбинированных или автономных тестов. И иногда процесс mongod
также зависал при выполнении комбинированных тестов.
mvn clean test
Процесс Mongod застрял:
[mongod output] 2020-04-24T03:34:34.139+0500 I COMMAND [LogicalSessionCacheRefresh] command config.$cmd command: createIndexes { createIndexes: "system.sessions", indexes: [ { key: { lastUse: 1 }, name: "lsidTTLIndex", expireAfterSeconds: 1800 } ], $db: "config" } numYields:0 reslen:114 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_msg 6323ms
[mongod output]
Тайм-ауты сокета или соединения:
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.2.jar:na]
at java.base/java.lang.Thread.run(Thread.java:830) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:579) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na]
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na]
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:339) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:603) ~[na:na]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-3.11.2.jar:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-3.11.2.jar:na]
... 3 common frames omitted
Проблема 2:
Как исключить de.flapdoodle.embed.mongo
для некоторых тестов. У меня есть пользовательская конфигурация для встроенного mongoDb в TestMongoConfig
.
@TestConfiguration
@EnableMongoRepositories(AC_REPOSITORY_MONGO_PACKAGE_NAME)
@TestPropertySource(locations = "classpath:application-test.yml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@DataMongoTest(excludeAutoConfiguration= {EmbeddedMongoAutoConfiguration.class})
@Profile(TEST_APP_PROFILE_ENABLED)
public class TestMongoConfig implements InitializingBean, DisposableBean {
private MongodExecutable executable;
@Value("${spring.data.mongodb.host:localhost}")
private String mongoDbHost;
@Value("${spring.data.mongodb.port:27019}")
private int mongoDbPort;
@Value("${spring.data.mongodb.database:test_db}")
private String mongoDbDatabase;
@Override
public void afterPropertiesSet() throws Exception {
IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
.net(new Net(mongoDbHost, mongoDbPort, Network.localhostIsIPv6()))
.build();
MongodStarter starter = MongodStarter.getDefaultInstance();
executable = starter.prepare(mongodConfig);
executable.start();
}
@Bean
public MongoDbFactory factory() {
MongoClientURI mongoClientURI = new MongoClientURI("mongodb://" + mongoDbHost + ":" + mongoDbPort + "/" + mongoDbDatabase);
MongoDbFactory mongoDbFactory = new SimpleMongoClientDbFactory(mongoClientURI.getURI());
return mongoDbFactory;
}
@Bean
@Primary
public MongoTemplate mongoTemplateTest(MongoDbFactory mongoDbFactory) {
MongoTemplate template = new MongoTemplate(mongoDbFactory);
template.setWriteConcern(WriteConcern.ACKNOWLEDGED);
return template;
}
@Override
public void destroy() throws Exception {
executable.stop();
}
}