有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    实际上,当前类和HttpUtility在方法中是强耦合的
    如果您认为^ {CD1}}是您想模仿的依赖项,则必须以允许设置依赖性的方式使用它。br/>

    但实际上,您无法在当前类中自然设置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);
        }
    }