在 Spring JUnit @WebMvcTest 中使用嵌入式 MongoDB

use*_*128 4 junit mongodb spring-data-mongodb spring-boot

我目前在 Spring 应用程序中使用 MongoDB。由于我添加了 Mongo,由于以下错误,我的端点测试不再起作用:

No qualifying bean of type 'xxx' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Run Code Online (Sandbox Code Playgroud)

我在控制器中自动装配的存储库如下:

private final RuleRepository ruleRepository;

@Autowired
public TestController(RuleRepository ruleRepository) {
    this.ruleRepository = ruleRepository;
}
Run Code Online (Sandbox Code Playgroud)

我认为这与 Mongo 以及我目前使用 AutoConfiguration 的事实有关。对于测试,我将 Flapdoodle Embed Mongo 依赖项添加到我的 pom.xml 中,并将范围设置为 test:

<dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>2.0.3</version>
        <scope>test</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

我的测试类如下所示:

RunWith(SpringRunner.class)
@WebMvcTest(value = RouteController.class, secure = false)
@ActiveProfiles("test")
public class TestControllerEndpointTests {

@Autowired
private MockMvc mockMvc;

@Autowired
private RuleRepository ruleRepository;

@Before
public void setupTests() {
    //Setup for the tests
}

    //Actual tests
}
Run Code Online (Sandbox Code Playgroud)

我还为 Mongo 测试数据库创建了一个 Configuration 类,但我不知道如何正确注册它:

@Configuration
@Profile("test")
public class TestMongoConfig {

    @Autowired
    private MongoProperties properties;

    @Autowired(required = false)
    private MongoClientOptions options;

    @Bean(destroyMethod = "close")
    public Mongo mongo(MongodProcess mongodProcess) throws IOException {
        Net net = mongodProcess.getConfig().net();
        return new MongoClient(net.getServerAddress().getHostName(), net.getPort());
    }

    @Bean(destroyMethod = "stop")
    public MongodProcess mongodProcess(MongodExecutable mongodExecutable) throws IOException {
        return mongodExecutable.start();
    }

    @Bean(destroyMethod = "stop")
    public MongodExecutable mongodExecutable(MongodStarter mongodStarter, IMongodConfig iMongodConfig) throws IOException {
        return mongodStarter.prepare(iMongodConfig);
    }

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

    @Bean
    public MongodStarter mongodStarter() {
        return MongodStarter.getDefaultInstance();
    }

}
Run Code Online (Sandbox Code Playgroud)

如何获得使用 @WebMvcTest 注释的端点测试以使用嵌入式 Mongo 数据库?

rap*_*lbs 6

敲了一阵子后,我们找到了@AutoConfigureDataMongo注释。

import org.springframework.boot.test.autoconfigure.data.mongo.AutoConfigureDataMongo;

@RunWith(SpringRunner.class)
@WebMvcTest(value = SampleController.class, secure = false)
@AutoConfigureDataMongo
public class SampleControllerTest {
Run Code Online (Sandbox Code Playgroud)

只需用它注释您的控制器,您应该org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo在运行此控制器测试时看到日志。