public void doFoo(int x, int y, String url) {
JSONObject json = new JSONObject().put("z", x + y);
try (final HttpUtility httpUtils = new HttpUtility()) {
httpUtils.doAuthPutJson(url,json);
}
}我想验证HTTPUtlity的输入。我该如何为此编写单元测试呢?
发布于 2018-01-12 05:33:55
实际上,当前类和HttpUtility在方法中是强耦合的。
如果您认为HttpUtility是您希望能够模拟的依赖项,则必须以允许设置依赖项的方式使用它。
但实际上您无法在当前类中自然地设置HttpUtility依赖项,因此您认为PowerMockito可以解决您的问题。
但实际上它不会。
它只会隐藏设计问题。
只需做一些小改动,您就可以有一个更清晰的设计,并以一种自然而直接的方式模拟HTTPUtlity实例化。
为了实现这一点,我将提取HttpUtility实例化作为由依赖项执行的处理。
所以我可以得到这样的代码:
public class Foo{
private Supplier<HttpUtility> httpUtilitySupplier;
public Foo(Supplier<HttpUtility> httpUtilitySupplier){
this.httpUtilitySupplier = httpUtilitySupplier;
}
public void doFoo(int x, int y, String url) {
JSONObject json = new JSONObject().put("z", x + y);
try (final HttpUtility httpUtils = httpUtilitySupplier.get()) {
httpUtils.doAuthPutJson(url,json);
}
}
}请注意,我使用构造函数来设置依赖项,因为它允许设置有关它的不变量,但如果需要,也可以使用setter。
现在,您可以很容易地检查测试中是否使用预期的参数调用了HttpUtility.doAuthPutJson():
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock
private HttpUtility httpUtilityMock;
@Test
public void testName() throws Exception {
// fixture
Foo foo = new Foo( () -> httpUtilityMock);
int x = ...;
int y = ...;
String url = ...;
// action
foo.doFoo(x, y, url);
// assertion
JSONObject expectedJSONObject = ...;
Mockito.verify(httpUtilityMock).doAuthPutJson(url, expectedJSONObject);
}
}https://stackoverflow.com/questions/48215869
复制相似问题