将 mockito 逻辑与生产代码集成

问题描述 投票:0回答:0

下面是一个简单的 java 命令行实用程序,用于将网页下载到文件中。

这段代码来自这里:

https://www.codejava.net/java-se/networking/java-urlconnection-and-httpurlconnection-examples

我的问题:将 mockito 与此命令行程序集成是个好主意吗?

例如,我想扩展此实用程序的功能以返回内部服务器错误响应代码,即使提供的 url 有效。

用例是开发的组件需要部署到临时服务器上的类生产运行实例中,无法安装像 Mockoon 这样的工具。此外,仅依赖于使用 JUnit 和 Mockito 开发的测试是不够的。这是因为在这种情况下,我们将运行集成测试,其中正在运行的实例具有所有依赖项,并且其他系统可以与组件交互。当组件在这样的环境中运行时,我需要查看它在 url 返回内部服务器错误时的行为方式。

我们可以使用 Mockoon 实现相同的效果,但是,由于政策限制无法安装 Mockoon,我想通过编写模拟逻辑以及开发的组件来找出是否有替代方案。

我对下面命令行实用程序的这种方法的想法,我们可以添加另一个参数来配置该实用程序来模拟

httpurlconnection
以返回内部服务器错误,即使 url 工作没有问题。

命令行实用程序的代码:

import java.net.*;
import java.io.*;
import java.util.*;
 
public class DownloadWebPage {
 
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Syntax: <url> <file>");
            return;
        }
 
        String url = args[0];
        String filePath = args[1];
 
        try {
 
            URL urlObj = new URL(url);
            URLConnection urlCon = urlObj.openConnection();
 
            InputStream inputStream = urlCon.getInputStream();
            BufferedInputStream reader = new BufferedInputStream(inputStream);
 
            BufferedOutputStream writer = new BufferedOutputStream(new FileOutputStream(filePath));
 
            byte[] buffer = new byte[4096];
            int bytesRead = -1;
 
            while ((bytesRead = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, bytesRead);
            }
 
            writer.close();
            reader.close();
 
            System.out.println("Web page saved");
 
        } catch (MalformedURLException e) {
            System.out.println("The specified URL is malformed: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("An I/O error occurs: " + e.getMessage());
        }
    }
}

下面是上面代码的粗略修改版本,以实现我正在寻找的内容:

import java.net.*;
import java.io.*;
import java.util.*;
 
public class DownloadWebPage {
 
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Syntax: <url> <file>");
            return;
        }
 
        String url = args[0];
        String filePath = args[1];
        String mockFlag = args[2];
 
        try {
 
            URL urlObj;
            URLConnection urlCon;

            if (mockFlag.equals("interal_server_error") {
                //Set up the mocks for urlObj and urlCon
                //Must return the response code Internal Server Error
                ...
                ...
            } else {
                urlObj = new URL(url);
                urlCon = urlObj.openConnection();
            }
 
            InputStream inputStream = urlCon.getInputStream();
            BufferedInputStream reader = new BufferedInputStream(inputStream);
 
            BufferedOutputStream writer = new BufferedOutputStream(new FileOutputStream(filePath));
 
            byte[] buffer = new byte[4096];
            int bytesRead = -1;
 
            while ((bytesRead = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, bytesRead);
            }
 
            writer.close();
            reader.close();
 
            System.out.println("Web page saved");
 
        } catch (MalformedURLException e) {
            System.out.println("The specified URL is malformed: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("An I/O error occurs: " + e.getMessage());
        }
    }
}

当然,我们首先要介绍的问题是可读性问题。我们可以通过使用 Strategy 软件设计模式来解决此类问题。我想知道这种方法是否合理,以前是否有人使用过。

java mockito httpurlconnection
© www.soinside.com 2019 - 2024. All rights reserved.