如何使junit测试在springboot应用程序中使用嵌入式mongoDB?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使junit测试在springboot应用程序中使用嵌入式mongoDB?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4400字,纯文字阅读大概需要7分钟。
内容图文
![如何使junit测试在springboot应用程序中使用嵌入式mongoDB?](/upload/InfoBanner/zyjiaocheng/907/bb201a0c24b649eea5ea93dcc30bb4bc.jpg)
我正在学习springboot并创建了一个简单的springboot应用程序.我希望它在运行单元测试时使用嵌入式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?
解决方法:
另一种方法是在测试中运行整个spring boot应用程序.在这种情况下,将自动发现您的spring启动应用程序,并将通过Spring Boot下载并启动嵌入式mongoDB
@RunWith(SpringRunner.class)
@SpringBootTest
public class YourSpringBootApplicationTests {
08:12:14.676 INFO EmbeddedMongo:42 – note: noprealloc may hurt
performance in many applications 08:12:14.694 INFO EmbeddedMongo:42 –
2017-12-31T08:12:14.693+0200 I CONTROL [initandlisten] MongoDB
starting : pid=2246 port=52299 08:12:22.005 INFO connection:71 –
Opened connection [connectionId{localValue:2, serverValue:2}] to
localhost:52299
如果是您的示例,您可以修改代码以便在不同的端口上启动嵌入式Mongo:
>添加test / resoures / test.properties文件以覆盖application.properties中的属性
mongo.db.name=person_testDB
mongo.db.url=localhost
mongo.db.port=12345
>修改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;
}
}
>修改测试类:
删除@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作为测试@Configuration类的一部分:它在此概述:How do you configure Embedded MongDB for integration testing in a Spring Boot application?
内容总结
以上是互联网集市为您收集整理的如何使junit测试在springboot应用程序中使用嵌入式mongoDB?全部内容,希望文章能够帮你解决如何使junit测试在springboot应用程序中使用嵌入式mongoDB?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。