最佳实践如何管理大量线模存根?

Best practice how to manage a lot of wiremock stubs?

我的单元测试广泛使用 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 存根?

避免重复编写相同存根的一种方法是在设置步骤中创建线模服务器时定义存根位置。您可以在文件夹中存储 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/__files/api/v1/user.json)

[
  {
    "id": "795e19ed-ccae-4cf6-82c4-92fe9c8ac348",
    "accountId": "307dd105-2aef-483f-b85d-3c46045031d5",
    "firstName": "John",
    "lastName": "Doe",
    "email": "john.doe@example.com"
  }
]

示例映射:(src/test/resources/mappings/api/v1/user-mapping.json)

{
  "request": {
    "method": "GET",
    "url": "/foo/api/v1/userProfiles?userIds=307dd105-2aef-483f-b85d-3c46045031d5,cb6fc0b3-4e99-4056-bbb4-c7ec6b240736,mock-completed-by-0"
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "bodyFileName": "api/v1/user.json"
  }
}

最重要的是,如果您想在某些测试用例中 覆盖 API 的存根值,那么您只需在测试用例中定义该存根就像你现在正在做的那样。看到这个 stub priority

不知道你用的是什么框架。但是,如果您有一个基于 spring-boot 的应用程序,您可以将存根放在单独的资源文件中并在 运行 测试时加载它。

@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!");
    }

}

来源: https://cloud.spring.io/spring-cloud-contract/reference/html/project-features.html#features-wiremock-registering-stubs