我有一些用于集成测试的测试用例。我的测试代码与外部REST API通信,因此集成测试需要模拟此API。然而,由于我也能够在外部API可用的环境中运行相同的测试,因此我希望能够构建我的测试,以便在一个配置文件中运行它使用模拟版本的API,而在另一个配置文件中,它们将使用可用的实际API。Spring Boot 测试是否可能-正确的方法是什么?
7kqas0il1#
对于mock,您可以运行一个mock Web服务器,并将其配置为返回您在测试中期望的任何响应。两个流行的模拟服务器是WireMock和MockServer。当您需要模拟时,您将替换URL以使用localhost:mockServerPort而不是外部API,并在所有测试之前在类前方法中启动服务器,并在测试完成后关闭它。您可以重用相同的测试代码。创建一个包含测试的抽象类和两个子类,一个使用外部URL,一个使用模拟URL。可以使用SpringBootTest的properties属性设置这些URL。WireMockSpring Boot Integration Tests With WireMock and JUnit 5How to Automate Tests for Spring Boot API using MockServerIntroduction to MockServerRunning MockServer
SpringBootTest
properties
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)中导入它。
@Configuration
@Import
@ContextConfiguration
2条答案
按热度按时间7kqas0il1#
对于mock,您可以运行一个mock Web服务器,并将其配置为返回您在测试中期望的任何响应。两个流行的模拟服务器是WireMock和MockServer。
当您需要模拟时,您将替换URL以使用localhost:mockServerPort而不是外部API,并在所有测试之前在类前方法中启动服务器,并在测试完成后关闭它。
您可以重用相同的测试代码。创建一个包含测试的抽象类和两个子类,一个使用外部URL,一个使用模拟URL。可以使用
SpringBootTest
的properties
属性设置这些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
tcbh2hod2#
如果您的API是一个Spring Bean,您应该能够将Bean作为测试的一部分提供。根据环境变量或系统属性(或Spring配置文件),返回真实的Bean或假Bean:
您可以随意将bean定义提取到
@Configuration
bean中,并从测试(@Import
或@ContextConfiguration
)中导入它。