使用MongoDB进行Spring Web服务测试

时间:2017-11-16 16:13:44

标签: spring mongodb spring-mvc mockito spring-test

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

@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?

2 个答案:

答案 0 :(得分:1)

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

@MockBean
private MongoTemplate mongoTemplate;

例如,您的课程应如下所示:

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

您可以找到包含集成和单元测试here的完整Spring Boot应用程序。

答案 1 :(得分:0)

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

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

  2. 为了测试您的服务层,该服务层又与mongo对话,您可以使用Fongonosqlunit

    这里有一些例子 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