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的输入。如何为此编写单元测试?
实际上,当前类和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);
}
}