在Mongo生产数据库和测试数据库之间切换-Java Spring引导
我有以下型号:在Mongo生产数据库和测试数据库之间切换-Java Spring引导,java,spring,mongodb,Java,Spring,Mongodb,我有以下型号: import org.springframework.data.annotation.Id; @Document public class Customer { @Id public String id; public String firstName; public String lastName; public Customer() {} public Customer(String firstName, Strin
import org.springframework.data.annotation.Id;
@Document
public class Customer {
@Id
public String id;
public String firstName;
public String lastName;
public Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%s, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
}
以及以下存储库:
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface CustomerRepository extends MongoRepository<Customer, String> {
public Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName);
}
当然我有一个SpringMongoConfig.java
@Configuration
@PropertySource(value={"classpath:application.properties"})
public class SpringMongoConfig extends AbstractMongoConfiguration {
@Value("${spring.data.mongodb.host}")
private String host;
@Value("${spring.data.mongodb.port}")
private Integer port;
@Value("${spring.data.mongodb.database}")
private String database;
public @Bean
MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory(new MongoClient(this.host + ":" + this.port), database);
}
public @Bean
MongoTemplate mongoTemplate() throws Exception {
MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory()),
new MongoMappingContext());
converter.setMapKeyDotReplacement("\\+");
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);
return mongoTemplate;
}
@Override
protected String getDatabaseName() {
return this.database;
}
@Override
public Mongo mongo() throws Exception {
return new MongoClient(this.host, this.port);
}
}
在执行单元测试时,如何在
生产
和测试
数据库之间切换 最简单的方法就是在测试中覆盖所需的属性:
@RunWith(SpringRunner.class)
@SpringBootTest(properties = {
"spring.data.mongodb.database=test_db"
})
@ContextConfiguration(classes = {CustomerTest.class})
public class CustomerTest {
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class)
@ContextConfiguration(classes = {CustomTestConfig.class})
public class CustomerTest {
如果您需要重新定义bean,例如使用内存中的fongo实现,您可以创建CustomTestConfig
并将其添加到测试中:
@RunWith(SpringRunner.class)
@SpringBootTest(properties = {
"spring.data.mongodb.database=test_db"
})
@ContextConfiguration(classes = {CustomerTest.class})
public class CustomerTest {
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class)
@ContextConfiguration(classes = {CustomTestConfig.class})
public class CustomerTest {
最简单的方法是在测试中覆盖所需的属性:
@RunWith(SpringRunner.class)
@SpringBootTest(properties = {
"spring.data.mongodb.database=test_db"
})
@ContextConfiguration(classes = {CustomerTest.class})
public class CustomerTest {
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class)
@ContextConfiguration(classes = {CustomTestConfig.class})
public class CustomerTest {
如果您需要重新定义bean,例如使用内存中的fongo实现,您可以创建CustomTestConfig
并将其添加到测试中:
@RunWith(SpringRunner.class)
@SpringBootTest(properties = {
"spring.data.mongodb.database=test_db"
})
@ContextConfiguration(classes = {CustomerTest.class})
public class CustomerTest {
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfig.class)
@ContextConfiguration(classes = {CustomTestConfig.class})
public class CustomerTest {
就个人而言,我更喜欢使用嵌入式数据库进行测试。你可以用 在测试班:
package com.backend.repository;
import com.backend.configuration.MongoConfiguration;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfiguration.class)
public class CustomerRepositoryTest {
}
对于开发和生产等其他配置文件,您可以使用spring引导配置文件(请参阅),也可以使用maven配置文件:
在application.properties
中添加此属性spring.data.mongodb.host=@mongo.host@
然后根据使用的配置文件在pom.xml
中定义它:
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<mongo.host>localhost</mongo.host>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<mongo.host>mongo</mongo.host>
</properties>
</profile>
发展
真的
本地服务器
戳
蒙戈
就个人而言,我更喜欢使用嵌入式数据库进行测试。你可以用
在测试班:
package com.backend.repository;
import com.backend.configuration.MongoConfiguration;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoConfiguration.class)
public class CustomerRepositoryTest {
}
对于开发和生产等其他配置文件,您可以使用spring引导配置文件(请参阅),也可以使用maven配置文件:
在application.properties
中添加此属性spring.data.mongodb.host=@mongo.host@
然后根据使用的配置文件在pom.xml
中定义它:
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<mongo.host>localhost</mongo.host>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<mongo.host>mongo</mongo.host>
</properties>
</profile>
发展
真的
本地服务器
戳
蒙戈
如果要切换联机数据库或测试数据库,请在单元测试时使用测试数据库。您可以在数据源配置上使用@条件注释。
方法如下:
将类添加到implConditional
。一个是联机条件,另一个是测试条件。您可以通过读取yml
config来实现这两个条件类
将这些条件添加到数据源配置中:
@有条件的(Online.class)
@组成部分
类OnlineDatasrouceConfig{
}
@条件(OnTest.class)
@组成部分
类TestDatasrouceConfig{
}
然后,spring将仅在条件为true时创建bean
以下是条件文件:
而且,在运行单元测试时,还有其他一些切换测试数据库的方法。
将@ActiveProfile(“test”)
添加到测试类中。spring将使用test.yml
初始化这个测试类。而且,您只需将测试数据库配置置于test.yml
(我使用这种方式)如果您想切换联机数据库或测试数据库,请在单元测试时使用测试数据库。您可以在数据源配置上使用@条件注释。
方法如下:
将类添加到implConditional
。一个是联机条件,另一个是测试条件。您可以通过读取yml
config来实现这两个条件类
将这些条件添加到数据源配置中:
@有条件的(Online.class)
@组成部分
类OnlineDatasrouceConfig{
}
@条件(OnTest.class)
@组成部分
类TestDatasrouceConfig{
}
然后,spring将仅在条件为true时创建bean
以下是条件文件:
而且,在运行单元测试时,还有其他一些切换测试数据库的方法。
将@ActiveProfile(“test”)
添加到测试类中。spring将使用test.yml
初始化这个测试类。而且,您只需要将您的测试数据库配置放在test.yml
(我是这样使用的)注意:您的数据模型与这个问题有什么关系,除了两者都与MongoDB有关之外?除此之外,您还可以使用环境变量来解决这个问题。注意:您的数据模型与这个问题有什么关系,除了两者都与MongoDB有关之外?除此之外,还可以使用环境变量进行此操作。