用于单元测试的Spring mongo db配置
我尝试使用fongo进行单元测试,并在测试中添加了另一个mongo配置来替换原来的配置,但它不起作用 我按照一些教程来使用用于单元测试的Spring mongo db配置,spring,mongodb,unit-testing,spring-mvc,Spring,Mongodb,Unit Testing,Spring Mvc,我尝试使用fongo进行单元测试,并在测试中添加了另一个mongo配置来替换原来的配置,但它不起作用 我按照一些教程来使用 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration 这两个注释用于测试类,我尝试了它,它失败了,bean创建错误如下: java.lang.IllegalStateException: Failed to load ApplicationContext org.springframework.bean
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
这两个注释用于测试类,我尝试了它,它失败了,bean创建错误如下:
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";
}
}
}
我正在使用SpringDataMongoDB:1.7.2.RELEASE,并通过在我的应用程序中调用mongoOperation而不是自动连接存储库来访问db。像这样
private AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(MongoConfig.class);
private MongoOperations mongoOperation =
(MongoOperations) context.getBean("mongoTemplate");
这是原因吗
@ComponentScan(basePackageClasses = { RecorderRepository.class })
不工作
我应该怎么做才能让它工作?如果您能提供任何帮助,我将不胜感激
=============================================================
更新:
我尝试了嵌入式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();
}
}
我从来没用过丰戈。不过,我已经做了这件事
这是为配合弹簧靴使用而设计的。Embedded Mongo启动,并设置
MongoProperties
以连接到嵌入式实例。如果您没有使用Spring Boot,那么您将需要更新负责mongo连接的任何配置,而不是更新MongoProperties
。感谢您的分享,我稍后会尝试。我需要在测试类中添加或调整任何注释吗?我用新配置更新了问题。你有什么办法让它工作吗?谢谢
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();
}
}