Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mongo生产数据库和测试数据库之间切换-Java Spring引导_Java_Spring_Mongodb - Fatal编程技术网

在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>

发展
真的
本地服务器
戳
蒙戈

如果要切换联机数据库或测试数据库,请在单元测试时使用测试数据库。您可以在数据源配置上使用
@条件
注释。
方法如下:

  • 将类添加到impl
    Conditional
    。一个是联机条件,另一个是测试条件。您可以通过读取
    yml
    config来实现这两个条件类

  • 将这些条件添加到数据源配置中:

  • 
    @有条件的(Online.class)
    @组成部分
    类OnlineDatasrouceConfig{
    }
    

    
    @条件(OnTest.class)
    @组成部分
    类TestDatasrouceConfig{
    }
    

    然后,spring将仅在条件为true时创建bean

    以下是条件文件:

    而且,在运行单元测试时,还有其他一些切换测试数据库的方法。
    @ActiveProfile(“test”)
    添加到测试类中。spring将使用
    test.yml
    初始化这个测试类。而且,您只需将测试数据库配置置于
    test.yml
    (我使用这种方式)

    如果您想切换联机数据库或测试数据库,请在单元测试时使用测试数据库。您可以在数据源配置上使用
    @条件
    注释。
    方法如下:

  • 将类添加到impl
    Conditional
    。一个是联机条件,另一个是测试条件。您可以通过读取
    yml
    config来实现这两个条件类

  • 将这些条件添加到数据源配置中:

  • 
    @有条件的(Online.class)
    @组成部分
    类OnlineDatasrouceConfig{
    }
    

    
    @条件(OnTest.class)
    @组成部分
    类TestDatasrouceConfig{
    }
    

    然后,spring将仅在条件为true时创建bean

    以下是条件文件:

    而且,在运行单元测试时,还有其他一些切换测试数据库的方法。
    @ActiveProfile(“test”)
    添加到测试类中。spring将使用
    test.yml
    初始化这个测试类。而且,您只需要将您的测试数据库配置放在
    test.yml
    (我是这样使用的)

    注意:您的数据模型与这个问题有什么关系,除了两者都与MongoDB有关之外?除此之外,您还可以使用环境变量来解决这个问题。注意:您的数据模型与这个问题有什么关系,除了两者都与MongoDB有关之外?除此之外,还可以使用环境变量进行此操作。