Java 如何管理大量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(); }

我的单元测试广泛使用wiremock,其中大多数测试类如下所示:

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合同。当你不得不“模仿”很多信息时,这是件好事。它是为了这个目的而建立的。我没有你的上下文,但是如果你看到自己做了太多或多余的设置,我会认为这是一种气味在你的测试方式。你在测试什么?您是否需要/关心所有这些设置?