使用 mockito 创建单元测试

Create unit test using mockito

我正在尝试为以下功能 setUrl 创建一个 junit 测试用例。我怎样才能用 mockito

模拟 java url class
   public void setUrl(String url) {      
            this.url = URLUtil.processURL(url);
            try {
                URL dst = new URL(this.url);
                InputStream is = dst.openStream();
                Scanner scanner = new Scanner(is);

                StringBuilder sb = new StringBuilder();

                while(scanner.hasNextLine())
                    sb.append(scanner.nextLine()).append("\n");


                if (validate(sb.toString())) {
                   --------
                } else {

                }
                is.close();
                scanner.close();
            } catch (Exception ex) {

            }        
    }


    private boolean validate(String content) {
        JSONParser parser = new JSONParser();
        Boolean isJsonValid = false;
        JSONObject json = null;
        try {
          --------
          //json validation goes here
        } catch (Exception e) {          
        }
        return isJsonValid;
    }

代码已尝试

 URL mockedURL = PowerMockito.mock(URL.class);
        MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);

        PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments(sourceUrl).thenReturn(mockedURL);
        PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);

但我不确定我的做法是否正确。

两个答案:

  • mocking 调用 new() 时,你 simply 必须遵循 all 强制性步骤,例如概述 here。含义:您需要使用@PrepareForTest 注释和正确的运行器。
  • 但真正的要点是:您一开始就不应该调用 new()。这使得测试代码变得更加困难。它迫使您依赖 PowerMock(ito)。而这种依赖性让你的生活变得更加艰难!

意思是:模拟调用 new() 在技术上是可行的,而且很直接,您只需要按照说明进行操作即可。但更好的长期解决方案是重新编写您的生产代码,以便您可以在没有 PowerMock(ito) 的情况下对其进行测试。例如,通过使用某种依赖注入,为您的测试代码提供一些 URL 对象。