Исключить Flapdoodle для некоторых тестов - PullRequest
0 голосов
/ 24 апреля 2020

Для интеграционных тестов я использую 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();
    }
}
...