2015-09-17 7 views
0

Я пытаюсь использовать fongo для модульного теста, и я добавляю еще одну конфигурацию mongo внутри теста, чтобы заменить оригинальную, но она не работает.Конфигурация весны mongo db для модульного теста

Я следовал некоторым учебникам использовать

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 

этих два аннотаций для тестового класса, и я попробовал его, он не с бобом творений ошибки следующим образом:

java.lang.IllegalStateException: Failed to load ApplicationContext 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultServletHandlerMapping' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class] 
org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'defaultServletHandlerMapping' threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 

Вот мой тестовый класс:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = Controller.class) 
public class ApplicationTests { 
    @Autowired 
    private WebApplicationContext webApplicationContext; 

    private MockMvc mockMvc; 

    @Before 
    public void setUp() throws Exception { 
    mockMvc = webAppContextSetup(webApplicationContext).build(); 
    } 

    ... Tests here ... 

    @After 
    public void tearDown() throws Exception { 
    } 

    @Configuration 
    @EnableMongoRepositories 
    @ComponentScan(basePackageClasses = { RecorderRepository.class }) 
    static class MongoConfiguration extends AbstractMongoConfiguration { 

    @Override 
    protected String getDatabaseName() { 
     return "test-db"; 
    } 

    @Override 
    public Mongo mongo() { 
     return new Fongo("test").getMongo(); 
    } 

    @Override 
    protected String getMappingBasePackage() { 
     return "com.mongo.test"; 
    } 
    } 
} 

Я использую spring-data-mongodb: 1.7.2.RELEASE и доступ к db путем вызова mo ngoOperation в моем приложении вместо autowired репозитория. Как это

private AnnotationConfigApplicationContext context = 
    new AnnotationConfigApplicationContext(MongoConfig.class); 
private MongoOperations mongoOperation = 
    (MongoOperations) context.getBean("mongoTemplate"); 

ли причина, почему

@ComponentScan(basePackageClasses = { RecorderRepository.class }) 

не работает?

Как мне сделать, чтобы это сработало? Я буду благодарен за любую помощь, которую вы можете предоставить.

=============================================================================================================================================== ===============

Update:

Я попытался внедренный MongoDB, все еще есть проблемы, которые недоступны подключения к базе данных. Нужно ли мне настраивать что-нибудь еще? Или добавить аннотацию?

Вот моя конфигурация:

static class MongoConfiguration extends AbstractMongoConfiguration { 
    private MongodStarter starter = MongodStarter.getDefaultInstance(); 

    @Override 
    public Mongo mongo() throws Exception { 
    return new MongoClient("localhost", 12345); 
    } 

    @Bean(destroyMethod = "stop") 
    public MongodProcess mongod() throws IOException { 
    return mongodExe().start(); 
    } 

    @Bean(destroyMethod = "stop") 
    public MongodExecutable mongodExe() throws IOException { 
    return starter.prepare(mongodConfig()); 
    } 

    @Bean 
    public IMongodConfig mongodConfig() throws IOException { 
    return new MongodConfigBuilder().version(Version.Main.PRODUCTION) 
            .net(new Net(12345,Network.localhostIsIPv6())) 
            .build(); 
    } 
} 

ответ

0

Я никогда не использовал Fongo. Я сделал это с Embedded Mongo.

import com.mongodb.Mongo; 
import com.mongodb.MongoClientOptions; 
import de.flapdoodle.embed.mongo.MongodExecutable; 
import de.flapdoodle.embed.mongo.MongodProcess; 
import de.flapdoodle.embed.mongo.MongodStarter; 
import de.flapdoodle.embed.mongo.config.IMongodConfig; 
import de.flapdoodle.embed.mongo.config.MongodConfigBuilder; 
import de.flapdoodle.embed.mongo.config.Net; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.autoconfigure.mongo.MongoProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

import java.io.IOException; 

import static de.flapdoodle.embed.mongo.distribution.Version.Main.PRODUCTION; 

/** 
* Embedded MongoDB configuration for testing. 
* 
* @author Ken Blair 
*/ 
@Configuration 
public class EmbeddedMongoConfig { 

    @Autowired 
    private MongoProperties properties; 

    @Autowired(required = false) 
    private MongoClientOptions options; 

    @Bean(destroyMethod = "close") 
    public Mongo mongo() throws IOException { 
     final Net net = mongod().getConfig().net(); 
     properties.setHost(net.getServerAddress().getHostName()); 
     properties.setPort(net.getPort()); 
     return properties.createMongoClient(options); 
    } 

    @Bean(destroyMethod = "stop") 
    public MongodProcess mongod() throws IOException { 
     return mongodExe().start(); 
    } 

    @Bean(destroyMethod = "stop") 
    public MongodExecutable mongodExe() throws IOException { 
     return MongodStarter.getDefaultInstance().prepare(mongodConfig()); 
    } 

    @Bean 
    public IMongodConfig mongodConfig() throws IOException { 
     return new MongodConfigBuilder().version(PRODUCTION).build(); 
    } 
} 

Предназначен для использования с пружинной загрузкой. Встраивается Mongo, и MongoProperties настроен для подключения к встроенному экземпляру. Если вы не используете Spring Boot, вместо обновления MongoProperties вы хотите обновить любую конфигурацию, отвечающую за соединение mongo.

+0

Спасибо, что поделились этим, я попробую его позже. Нужно ли добавлять или корректировать любые аннотации в тестовом классе? –

+0

Я обновил вопрос с новой конфигурацией. У вас есть идея заставить его работать? Благодаря! –