如何为使用网络连接的类编写 jUnit 测试

2022-09-01 14:08:36

我想知道在以下类中使用jUnit测试来测试方法“pushEvent()”的最佳方法是什么。我的问题是,私有方法“callWebsite()”总是需要连接到网络。如何避免此要求或重构我的类,以便在没有连接到网络的情况下对其进行测试?

class MyClass {

    public String pushEvent (Event event) {
        //do something here
        String url = constructURL (event); //construct the website url
        String response = callWebsite (url);

        return response;
    }

    private String callWebsite (String url) {
        try {
            URL requestURL = new URL (url);
            HttpURLConnection connection = null;
            connection = (HttpURLConnection) requestURL.openConnection ();


            String responseMessage = responseParser.getResponseMessage (connection);
            return responseMessage;
        } catch (MalformedURLException e) {
            e.printStackTrace ();
            return e.getMessage ();
        } catch (IOException e) {
            e.printStackTrace ();
            return e.getMessage ();
        }
    }

}

答案 1

存根

您需要一个测试双(存根)来允许隔离的,简单的单元测试。以下内容未经测试,但演示了该想法。使用依赖注入将允许您在测试时注入,这是HttpURLConnection的测试版本。

public class MyClass() 
{
   private IHttpURLConnection httpUrlConnection;   

   public MyClass(IHttpURLConnection httpUrlConnection)
   {
       this.httpUrlConnection = httpUrlConnection;
   }

   public String pushEvent(Event event) 
   {
       String url = constructURL(event);
       String response = callWebsite(url);
       return response;
  }
}

然后,创建一个存根(有时称为模拟对象)作为具体实例的替身。

class TestHttpURLConnection : IHttpURLConnection { /* Methods */ }

您还将构造一个具体版本,供生产代码使用。

class MyHttpURLConnection : IHttpURLConnection { /* Methods */ }

使用测试类(适配器),您可以指定测试期间应发生的情况。模拟框架将使您能够使用更少的代码执行此操作,或者您可以手动连接它。测试的最终结果是,您将设置对测试的期望,例如,在这种情况下,您可以将OpenConnection设置为返回真正的布尔值(顺便说一句,这只是一个示例)。然后,您的测试将断言,当此值为 true 时,PushEvent 方法的返回值与某些预期结果匹配。我有一段时间没有正确接触Java,但这里有一些由StackOverflow成员指定的推荐模拟框架


答案 2

可能的解决方案:您可以扩展此类,重写 callWebsite(您必须为此目的使其受到保护) - 并且 override 方法编写一些存根方法实现。


推荐