Spring Web 服务测试 MongoDB

Spring Web Service Test with MongoDB

我正在为我的 Spring Boot Web 应用程序编写服务测试,该应用程序充当 MongoDB 的接口。理想情况下,我的服务测试将测试我的 Spring 应用程序的每个组件,然后最终达到 Mocked MongoTemplate。以下代码使用 MockMvc 访问我的网络端点。

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
@AutoConfigureDataMongo
public class MyControllerServiceTest {

  @Autowired
  private MockMvc mvc;

  @Autowired
  private MongoTemplate mongoTemplate

  @SpyBean
  private MyMongoRepository myMongoRepository;

  @Test
  public void createTest() {
    MyObject create = new MyObject()

    given(this.myMongoRepository.insert(create));

    this.mvc.perform(post("localhost:8080/myService")...)...;
  }
}

MyController 包含一个 @Autowired MyMongoRepository,它又实现了 MongoRepository 并且需要一个 mongoTemplate bean。仅当可以找到 运行 MongoDB 实例时,此代码才能正确执行(此示例更多是我的服务与 MongoDB 之间的集成测试)。

如何在仍然使用 MockMvc 的同时模拟 MongoTemplate?

我认为更好的测试方法是分别测试您的网络层(控制器)和服务层。

  1. 为了测试您的网络层,您可以使用 MockMvc 并且您可以模拟您的服务层。

  2. 为了测试反过来与 mongo 对话的服务层,您可以使用 Fongo and nosqlunit.

    这里有一些例子
    https://arthurportas.wordpress.com/2017/01/21/sample-project-using-spring-boot-and-mongodbfongo-and-test-repository-with-nosqlunit/

    https://github.com/JohnathanMarkSmith/spring-fongo-demo

您需要将以下行添加到您的测试单元中:

@MockBean
private MongoTemplate mongoTemplate;

例如,您的 class 应如下所示:

@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class, excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)
public class MyMvcTests {

  @Autowired
  private MockMvc mvc;

  @MockBean
  private MyRepository repository;

  @MockBean
  private MongoTemplate mongoTemplate;

  @Test
  public void someTest() {}
}      

您可以找到一个完整的 Spring 引导应用程序,其中包括集成和单元测试 here