Java 如何管理大量wiremock存根的最佳实践?
我的单元测试广泛使用wiremock,其中大多数测试类如下所示:Java 如何管理大量wiremock存根的最佳实践?,java,unit-testing,testing,junit,wiremock,Java,Unit Testing,Testing,Junit,Wiremock,我的单元测试广泛使用wiremock,其中大多数测试类如下所示: class Test { private static WireMockServer wireMockServer; @BeforeAll static void setup() { wireMockServer = new WireMockServer(wireMockConfig().port(8080)); wireMockServer.start(); }
class Test {
private static WireMockServer wireMockServer;
@BeforeAll
static void setup() {
wireMockServer = new WireMockServer(wireMockConfig().port(8080));
wireMockServer.start();
}
@AfterAll
static void teardown() {
wireMockServer.stop();
}
@AfterEach
void deleteScenariosAndRequests() {
resetAllScenarios();
resetAllRequests();
}
@Test
void test1() throws {
stubFor(post(urlEqualTo(SOME_URL))
.willReturn(okJson("{}")));
stubFor(post(urlEqualTo(SOME_OTHER_URL))
.willReturn(okJson("{}")));
stubFor(post(urlEqualTo(EVEN_ANOTHER_URL))
.willReturn(okJson("{}")));
//some action
//some assertions
}
@Test
void test2() {
stubFor(post(urlEqualTo(SOME_URL))
.willReturn(aResponse().withStatus(400)));
stubFor(post(urlEqualTo(SOME_URL))
.willReturn(aResponse().withStatus(400)));
stubFor(post(urlEqualTo(SOME_URL))
.willReturn(aResponse().withStatus(400)));
//some action
//some assertions
}
}
正如你所看到的,我基本上做的是在每个测试中定义这个测试所需要的存根
这真的是好的做法吗?我看到自己一次又一次地重复同样的短文。另一方面,还有一个优点,即每个测试都明确说明它需要什么
如何在java单元测试中管理wiremock存根,有没有公认的最佳实践?避免重复写入相同存根的一种方法是在设置步骤中创建wiremock服务器时定义存根位置。您可以将100个存根存储在文件夹中并重新使用 WireMock以编程方式启动时,如果未另行配置,将默认为src/test/resources作为文件系统根。
// Set the root of the filesystem WireMock will look under for files and mappings
.usingFilesUnderDirectory("/path/to/files-and-mappings-root")
// Set a path within the classpath as the filesystem root
.usingFilesUnderClasspath("root/path/under/classpath")
例如
示例响应json(src/test/resources/_文件/api/v1/user.json)
示例映射:(src/test/resources/mappings/api/v1/user-mapping.json)
最重要的是,如果您想在某个测试用例中覆盖API的存根值,那么您只需像当前一样在测试用例中定义该存根。参见此避免重复写入相同存根的一种方法是在设置步骤中创建wiremock服务器时定义存根位置。您可以将100个存根存储在文件夹中并重新使用 WireMock以编程方式启动时,如果未另行配置,将默认为src/test/resources作为文件系统根。
// Set the root of the filesystem WireMock will look under for files and mappings
.usingFilesUnderDirectory("/path/to/files-and-mappings-root")
// Set a path within the classpath as the filesystem root
.usingFilesUnderClasspath("root/path/under/classpath")
例如
示例响应json(src/test/resources/_文件/api/v1/user.json)
示例映射:(src/test/resources/mappings/api/v1/user-mapping.json)
最重要的是,如果您想在某个测试用例中覆盖API的存根值,那么您只需像当前一样在测试用例中定义该存根。看这个我不知道你在用哪个框架。然而,若您有一个基于
springboot
的应用程序,那个么您可以将存根放在seprate资源文件中,并在运行测试时加载它
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureWireMock(stubs="classpath:/stubs")
public class WiremockImportApplicationTests {
@Autowired
private Service service;
@Test
public void contextLoads() throws Exception {
assertThat(this.service.go()).isEqualTo("Hello World!");
}
}
来源:我不知道您正在使用哪个框架。然而,若您有一个基于
springboot
的应用程序,那个么您可以将存根放在seprate资源文件中,并在运行测试时加载它
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureWireMock(stubs="classpath:/stubs")
public class WiremockImportApplicationTests {
@Autowired
private Service service;
@Test
public void contextLoads() throws Exception {
assertThat(this.service.go()).isEqualTo("Hello World!");
}
}
来源:您可以试试Spring云合约。当你不得不“模仿”很多信息时,这是件好事。它是为了这个目的而建立的。我没有你的上下文,但是如果你看到自己做了太多或多余的设置,我会认为这是一种气味在你的测试方式。你在测试什么?你需要/关心所有这些设置吗?你可以试试SpringCloud合同。当你不得不“模仿”很多信息时,这是件好事。它是为了这个目的而建立的。我没有你的上下文,但是如果你看到自己做了太多或多余的设置,我会认为这是一种气味在你的测试方式。你在测试什么?您是否需要/关心所有这些设置?