user2467128
user2467128

Reputation: 153

Using embedded MongoDB in Spring JUnit @WebMvcTest

I'm currently using MongoDB in my Spring application. Since I added Mongo my endpoint tests no longer work due to the following error:

No qualifying bean of type 'xxx' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

The repository which I Autowire in a controller is as follows:

private final RuleRepository ruleRepository;

@Autowired
public TestController(RuleRepository ruleRepository) {
    this.ruleRepository = ruleRepository;
}

I assume that this has to do with Mongo and the fact that I currently use AutoConfiguration for it. For the test I added the Flapdoodle Embed Mongo dependency, which seems to be used for testing purposes in a lot of examples, to my pom.xml with the scope set to test:

<dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>2.0.3</version>
        <scope>test</scope>
    </dependency>

My test class looks like this:

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
}

I also created a Configuration class for the Mongo Test Database, but I don't know how to correctly register it:

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

}

How do I get an endpoint test that is annotated with @WebMvcTest to use the embedded Mongo database?

Upvotes: 5

Views: 3268

Answers (1)

raphaelbs
raphaelbs

Reputation: 469

After banging our heads for a while we found the @AutoConfigureDataMongo annotation.

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

@RunWith(SpringRunner.class)
@WebMvcTest(value = SampleController.class, secure = false)
@AutoConfigureDataMongo
public class SampleControllerTest {

Just annotate your controller with it and you should see org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo logs when running this controller tests.

Upvotes: 7

Related Questions