如何对Spring Boot MongoRepository进行单元测试?

Joh*_*eke 10 mongodb spring-data-mongodb spring-boot

在我的Spring Boot Web应用程序中,我使用MongoDB来存储数据.在应用程序中,我使用扩展的接口访问数据库MongoRepository.

如何为此类存储库类设置单元测试?我想要的是

  • 启动MongoDB的嵌入式/内存实例
  • 从JSON或XML插入testdata
  • 使用自动装配的存储库对testdata执行查询

我尝试过使用Embedded MongoDB,但我无法弄清楚如何从文件中插入testdata.我也尝试使用NoSQLUnit,但SpringApplicationConfiguration与单元测试配置冲突,导致不同的数据库进行读写.

Mar*_*szS 8

只需使用Spring Boot 中的@DataMongoTest即可。

@RunWith(SpringRunner.class)
@DataMongoTest
public class FooRepositoryTest {

    @Autowired
    FooRepository fooRepository;

    @Before
    public void setUp() throws Exception {
        fooRepository.save(new Foo());
    }

    @Test
    public void shouldBeNotEmpty() {
        assertThat(fooRepository.findAll()).isNotEmpty();
    }
}
Run Code Online (Sandbox Code Playgroud)

依赖关系

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Nik*_*iou 6

2018 和 Spring Boot 2 的更新。首先,您可以根据文档对嵌入式数据库进行仅数据集成测试。这使用DataMongoTest注释。这仅配置使 mongoDB 测试成为可能的必要依赖项。

如果要进行完整的集成测试,请添加AutoConfigureDataMongo注释:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureDataMongo
public class PriceApiControllerIT {
Run Code Online (Sandbox Code Playgroud)

你应该在你的依赖项pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)


afr*_*sse 2

我遇到了同样的问题,我们使用一个单独的 MongoConfiguration 类来为我们的测试指定特定的配置。

您可以使用 EmbeddedMongoBuilder 创建嵌入式 mongo 实例,如下所示:

import com.mongodb.Mongo;
import cz.jirutka.spring.embedmongo.EmbeddedMongoBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.net.ServerSocket;

@Configuration
public class MongoConfiguration {

    @Bean
    public Mongo mongo() throws IOException {
        System.setProperty("DB.TRACE","true");
        return new EmbeddedMongoBuilder()
            .version("2.13.1")
            .bindIp("127.0.0.1")
            .port(allocateRandomPort())
            .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的测试类中,指定您想要通过 @Import 注释使用该特定配置:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Import(MongoConfiguration.class)
Run Code Online (Sandbox Code Playgroud)

希望有帮助。