用于单元测试的Spring mongo db配置

用于单元测试的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

我尝试使用fongo进行单元测试,并在测试中添加了另一个mongo配置来替换原来的配置,但它不起作用

我按照一些教程来使用

@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();
    }
}