首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JUNIT / Mockito中验证以下案例

如何在JUNIT / Mockito中验证以下案例
EN

Stack Overflow用户
提问于 2018-01-12 05:12:43
回答 1查看 136关注 0票数 0
代码语言:javascript
复制
 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的输入。我该如何为此编写单元测试呢?

EN

回答 1

Stack Overflow用户

发布于 2018-01-12 05:33:55

实际上,当前类和HttpUtility在方法中是强耦合的。

如果您认为HttpUtility是您希望能够模拟的依赖项,则必须以允许设置依赖项的方式使用它。

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

但实际上它不会。

它只会隐藏设计问题。

只需做一些小改动,您就可以有一个更清晰的设计,并以一种自然而直接的方式模拟HTTPUtlity实例化。

为了实现这一点,我将提取HttpUtility实例化作为由依赖项执行的处理。

所以我可以得到这样的代码:

代码语言:javascript
复制
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()

代码语言:javascript
复制
@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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48215869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档