MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come fare in modo che i test di junit utilizzino il mongoDB incorporato in un'applicazione springboot?

Un'alternativa sarebbe eseguire l'intera applicazione di avvio primaverile in test. In questo caso la tua applicazione Spring Boot verrà rilevata automaticamente e mongoDB incorporato verrà scaricato e avviato da Spring Boot

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourSpringBootApplicationTests {

08:12:14.676 INFO EmbeddedMongo:42 - nota:noprealloc può danneggiare le prestazioni in molte applicazioni 08:12:14.694 INFO EmbeddedMongo:42 -2017-12-31T08:12:14.693+0200 I CONTROL [initandlisten] MongoDBstarting:pid=2246 port =52299 08:12:22.005 INFO connection:71 -Connessione aperta [connectionId{localValue:2, serverValue:2}] tolocalhost:52299

Nel caso del tuo esempio potresti modificare il codice per avviare Mongo incorporato su una porta diversa:

  1. aggiungi il file test/resoures/test.properties per sovrascrivere le proprietà da application.properties

    mongo.db.name=person_testDB
    mongo.db.url=localhost
    mongo.db.port=12345
    
  2. modifica MongoDBConfig:aggiungi il campo MONGO_DB_PORT

    @EnableMongoRepositories
    public class MongoDBConfig {
        @Value("${mongo.db.url}")
        private String MONGO_DB_URL;
    
        @Value(("${mongo.db.port:27017}"))
        private int MONGO_DB_PORT;
    
        @Value("${mongo.db.name}")
        private String MONGO_DB_NAME;
    
        @Bean
        public MongoTemplate mongoTemplate() {
            MongoClient mongoClient = new MongoClient(MONGO_DB_URL, MONGO_DB_PORT);
            MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
            return mongoTemplate;
        }
    }
    
  3. modifica la classe di test:rimuovi l'annotazione @DataMongoTest. Questa annotazione forza l'avvio dell'istanza mongoDB incorporata

    static MongodExecutable mongodExecutable;
    
    @BeforeClass
    public static void setup() throws Exception {
        MongodStarter starter = MongodStarter.getDefaultInstance();
        String bindIp = "localhost";
        int port = 12345;
        IMongodConfig mongodConfig = new MongodConfigBuilder()
                .version(Version.Main.PRODUCTION)
                .net(new Net(bindIp, port, Network.localhostIsIPv6()))
                .build();
        mongodExecutable = null;
        try {
            mongodExecutable = starter.prepare(mongodConfig);
            mongodExecutable.start();
        } catch (Exception e){
            // log exception here
            if (mongodExecutable != null)
                mongodExecutable.stop();
        }
    }
    
    @AfterClass
    public static void teardown() throws Exception {
        if (mongodExecutable != null)
            mongodExecutable.stop();
    }
    

Un altro modo è utilizzare MongoRepository e init embedded Mongo come parte della classe test @Configuration:è descritto qui:come si configura Embedded MongDB per i test di integrazione in un'applicazione Spring Boot?