gpt4 book ai didi

java - 如何在 JUNIT/Mockito 中验证以下情况

转载 作者:行者123 更新时间:2023-12-02 11:45:44 25 4
gpt4 key购买 nike

 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);
}
}

我想验证 HTTPUtility 的输入。我该如何为此编写单元测试?

最佳答案

实际上当前类和HttpUtility在方法中是强耦合的。
如果您认为 HttpUtility 是您希望能够模拟的依赖项,则必须以允许设置依赖项的方式使用它。

但实际上您无法在当前类中自然地设置 HttpUtility 依赖项,因此您认为 PowerMockito 可以解决您的问题。
但事实上不会。
它只会隐藏设计问题。

只需进行一些小的更改,您就可以以自然、直接的方式获得更清晰的设计和模拟 HTTPUtility 实例化。

为了实现这一目标,我会将 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);
}
}

关于java - 如何在 JUNIT/Mockito 中验证以下情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48215869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com