mockito Spring Boot 集成测试-重复使用(有和没有模拟)

llew8vvj  于 9个月前  发布在  Spring
关注(0)|答案(2)|浏览(96)

我有一些用于集成测试的测试用例。我的测试代码与外部REST API通信,因此集成测试需要模拟此API。然而,由于我也能够在外部API可用的环境中运行相同的测试,因此我希望能够构建我的测试,以便在一个配置文件中运行它使用模拟版本的API,而在另一个配置文件中,它们将使用可用的实际API。
Spring Boot 测试是否可能-正确的方法是什么?

7kqas0il

7kqas0il1#

对于mock,您可以运行一个mock Web服务器,并将其配置为返回您在测试中期望的任何响应。两个流行的模拟服务器是WireMock和MockServer。
当您需要模拟时,您将替换URL以使用localhost:mockServerPort而不是外部API,并在所有测试之前在类前方法中启动服务器,并在测试完成后关闭它。
您可以重用相同的测试代码。创建一个包含测试的抽象类和两个子类,一个使用外部URL,一个使用模拟URL。可以使用SpringBootTestproperties属性设置这些URL。
WireMock
Spring Boot Integration Tests With WireMock and JUnit 5
How to Automate Tests for Spring Boot API using MockServer
Introduction to MockServer
Running MockServer

tcbh2hod

tcbh2hod2#

如果您的API是一个Spring Bean,您应该能够将Bean作为测试的一部分提供。根据环境变量或系统属性(或Spring配置文件),返回真实的Bean或假Bean:

@SpringBootTest
class ApiTest {
  @Autowired private Environment env;
  @Autowired YourService service;

  @Bean
  public YourApi api() {
    if (Object.equals("true", env.getProperty("use_real_api"))) {
      return new YourApi();
    } else {
      return Mockito.mock(YourApi.class);
    }
  }

  @Test
  void test() {
     service.callApi();
     // assert, verify, …
  }
}

您可以随意将bean定义提取到@Configuration bean中,并从测试(@Import@ContextConfiguration)中导入它。

相关问题