正确放置 Junit 测试中的存根 class for wiremock
Correct placement of the stubs in Junit test class for wiremock
我从 here 中找到了以下代码。所有存根都在 @Before
部分中创建。
@Rule
public WireMockRule wireMockRule = new WireMockRule(18089);
private HttpFetcher instance;
@Before
public void init() {
instance = new HttpFetcher();
// all the stubs
stubFor(get(urlEqualTo("/hoge.txt")).willReturn(
aResponse().withStatus(200).withHeader("Content-Type", "text/plain").withBody("hoge")));
stubFor(get(urlEqualTo("/500.txt")).willReturn(
aResponse().withStatus(500).withHeader("Content-Type", "text/plain").withBody("hoge")));
stubFor(get(urlEqualTo("/503.txt")).willReturn(
aResponse().withStatus(503).withHeader("Content-Type", "text/plain").withBody("hoge")));
}
@Test
public void ok() throws Exception {
String actual = instance.fetchAsString("http://localhost:18089/hoge.txt");
String expected = "hoge";
assertThat(actual, is(expected));
}
@Test(expected = HttpResponseException.class)
public void notFound() throws Exception {
instance.fetchAsString("http://localhost:18089/NOT_FOUND");
}
@Test(expected = HttpResponseException.class)
public void internalServerError() throws Exception {
instance.fetchAsString("http://localhost:18089/500.txt");
}
@Test(expected = HttpResponseException.class)
public void serviceUnavailable() throws Exception {
instance.fetchAsString("http://localhost:18089/503.txt");
}
}
这是正确的做法吗?如果我们在 @Test
方法本身中创建存根不是更好吗(这样可以很容易地识别与该测试相关的存根)。
"correct" 方法总是有争议的。
@Before 方法中的代码每次都会 运行,在每个 @Test 方法之前。
考虑到这一点,您可以选择是将它们留在那里还是将它们移动到每个测试方法。
一方面,我非常重视可读性,并且我同意,由于这些存根在测试之间根本不共享,因此将每个存根放入使用它们的测试中会更具可读性(因此更好) .
编写单元测试时,您始终需要在 "generic" 最佳实践(例如:"avoid code duplication at all means")和 "unit test specific" 最佳实践(例如:理想情况下,所有知识理解测试方法所需的理想位置是在该测试方法中)。
从这个意义上讲,合理的方法可能是:
- 多个测试用例共享的设置可以进入 @Before setup() 方法
- 仅由一个测试用例使用的设置...仅进入该测试用例
我从 here 中找到了以下代码。所有存根都在 @Before
部分中创建。
@Rule
public WireMockRule wireMockRule = new WireMockRule(18089);
private HttpFetcher instance;
@Before
public void init() {
instance = new HttpFetcher();
// all the stubs
stubFor(get(urlEqualTo("/hoge.txt")).willReturn(
aResponse().withStatus(200).withHeader("Content-Type", "text/plain").withBody("hoge")));
stubFor(get(urlEqualTo("/500.txt")).willReturn(
aResponse().withStatus(500).withHeader("Content-Type", "text/plain").withBody("hoge")));
stubFor(get(urlEqualTo("/503.txt")).willReturn(
aResponse().withStatus(503).withHeader("Content-Type", "text/plain").withBody("hoge")));
}
@Test
public void ok() throws Exception {
String actual = instance.fetchAsString("http://localhost:18089/hoge.txt");
String expected = "hoge";
assertThat(actual, is(expected));
}
@Test(expected = HttpResponseException.class)
public void notFound() throws Exception {
instance.fetchAsString("http://localhost:18089/NOT_FOUND");
}
@Test(expected = HttpResponseException.class)
public void internalServerError() throws Exception {
instance.fetchAsString("http://localhost:18089/500.txt");
}
@Test(expected = HttpResponseException.class)
public void serviceUnavailable() throws Exception {
instance.fetchAsString("http://localhost:18089/503.txt");
}
}
这是正确的做法吗?如果我们在 @Test
方法本身中创建存根不是更好吗(这样可以很容易地识别与该测试相关的存根)。
"correct" 方法总是有争议的。
@Before 方法中的代码每次都会 运行,在每个 @Test 方法之前。
考虑到这一点,您可以选择是将它们留在那里还是将它们移动到每个测试方法。
一方面,我非常重视可读性,并且我同意,由于这些存根在测试之间根本不共享,因此将每个存根放入使用它们的测试中会更具可读性(因此更好) .
编写单元测试时,您始终需要在 "generic" 最佳实践(例如:"avoid code duplication at all means")和 "unit test specific" 最佳实践(例如:理想情况下,所有知识理解测试方法所需的理想位置是在该测试方法中)。
从这个意义上讲,合理的方法可能是:
- 多个测试用例共享的设置可以进入 @Before setup() 方法
- 仅由一个测试用例使用的设置...仅进入该测试用例