如何在springboot应用程序中使用嵌入式mongoDB进行junit测试?

天蓝色 :

我正在学习springboot,并创建了一个简单的springboot应用程序。我希望它在运行单元测试时使用嵌入式mongoDB,并在其余应用程序中使用外部mongoDB。但是,它使用外部mongoDB进行单元测试,而不是使用嵌入式mongoDB。我的POM中有以下两个依赖项。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <scope>test</scope>
    </dependency>

我的属性文件具有以下内容:

# MongoDB properties
mongo.db.name=person_testDB
mongo.db.url=localhost

#external Mongo url
spring.data.mongodb.uri=mongodb://localhost:27017/personDB

我有一个配置文件(MongoDBConfig.java),其中包含嵌入式MongoDB配置:

@EnableMongoRepositories
public class MongoDBConfig {

@Value("${mongo.db.url}")
private String MONGO_DB_URL;

@Value("${mongo.db.name}")
private String MONGO_DB_NAME;

@Bean
public MongoTemplate mongoTemplate() {
    MongoClient mongoClient = new MongoClient(MONGO_DB_URL);
    MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
    return mongoTemplate;
 }
}

以下是我的PersonService.java课程:

@Service
public class PersonService  {
private static final Logger logger = LoggerFactory.getLogger(PersonService.class);      
@Autowired
MongoTemplate mongoTemplate;            
public void savePerson(Person person) {
    String name = person.getName();
    String collectionName = name.substring(0, 1);
        mongoTemplate.save(person, collectionName);
    }               
}

我对PersonsService类的单元测试如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MongoDBConfig.class})
@SpringBootTest(classes = PersonService.class)
@DataMongoTest
public class PersonServiceTest {

@Autowired
PersonService personService;    
MongodForTestsFactory factory;
MongoClient mongo;

@Before
public void setup() throws Exception {
    factory = MongodForTestsFactory.with(Version.Main.PRODUCTION);
    mongo = factory.newMongo();
}

@After
public void teardown() throws Exception {
    if (factory != null)
        factory.shutdown();
}

@Test
public void testSave(){
Person person = new Person("Bob Smith " , 25);
personService.savePerson(person);
}
}

它在外部MongoDB中正确创建了集合名称和文档名称,这不是我想要的。如何将unitTests限制为嵌入式Mongo?

亚历克斯M981:

一种替代方法是在测试中运行整个spring boot应用程序。在这种情况下,您的spring boot应用程序将被自动发现,嵌入式mongoDB将由Spring Boot下载并启动。

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

08:12:14.676 INFO EmbeddedMongo:42-注意:noprealloc可能会损害许多应用程序的性能08:12:14.694 INFO EmbeddedMongo:42-2017-12-31T08:12:14.693 + 0200 I CONTROL [initandlisten] MongoDB开始:pid = 2246 port = 52299 08:12:22.005 INFO连接:71-已打开到本地主机的连接[connectionId {localValue:2,serverValue:2}]

在您的示例中,您可以修改代码以在其他端口上启动嵌入式Mongo:

  1. 添加test / resoures / test.properties文件以覆盖application.properties中的属性

    mongo.db.name=person_testDB
    mongo.db.url=localhost
    mongo.db.port=12345
    
  2. 修改MongoDBConfig:添加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. 修改测试类:删除@DataMongoTest批注。该注释强制启动嵌入式mongoDB实例

    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();
    }
    

另一种方法是将MongoRepository和init嵌入式Mongo作为test @Configuration类的一部分使用:此处概述:如何配置Embedded MongDB以在Spring Boot应用程序中进行集成测试?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在angular2应用程序中使用Braintree的嵌入式UI?

如何在iOS的嵌入式专用框架和应用程序中使用静态库

如何测试嵌入式红宝石应用程序?

如何使用HTML中的嵌入式Java应用程序进行本地文件系统访问

用于非Spring应用程序的Junit测试嵌入式数据库

如何使嵌入式mongodb在应用程序关闭时保持数据?

如何对包含嵌入式助手的应用程序包进行公证?

如何为机器人应用程序/嵌入式系统进行python过渡

g ++:在嵌入式应用程序中使用单例

使用嵌入式Jetty和jersey建立Web应用程序,并进行请求分派

如何在Spring Boot应用程序中排除嵌入式Tomcat

如何在R Shiny应用程序中显示嵌入式推文?

如何在C#Windows Forms应用程序中运行嵌入式.exe文件?

如何从嵌入式应用程序实际使用设备树Blob?

如何使用Spring Boot应用程序在嵌入式Jetty中配置异步超时

如何使用嵌入式tomcat会话集群设置Spring Boot应用程序?

如何在MongoDB中使用数组获取嵌入式文档(使用Mongoose)

如何创建/查找应用程序jar以使用嵌入式tomcat部署Spring Boot Maven应用程序?

如何在mongodb中使用node.js删除嵌入式(嵌套)文档

如何在mongoDB中的多对多关系中使用嵌入式文档结构?

如何从本机iOS应用程序控制嵌入式Unity应用程序

如何在嵌入式框架中使用Cocoapods?

如何在测试Web应用程序中使用MongoDB PHP库

我们如何在PWA应用程序中使用cypress进行离线测试?

错误:嵌入式二进制文件未使用与父应用程序相同的证书进行签名

使用应用程序工厂模式时,如何从嵌入式Dash应用程序中访问Flask应用程序的上下文?

如何使用主应用程序和引导加载程序中的一项功能?(嵌入式)

如何在运行时向嵌入式应用程序添加多种语言选择?

如何在现有的Spring Boot应用程序中更改嵌入式tomcat的版本?