java - JUnit Mockito URL 和 HttpsURLConnection

标签 java junit mockito

我有以下代码:

public byte[] myFunction(String s1, String s2, String s3) {

    try {           
            URL myUrl = new URL("https://myUrl");
            HttpsURLConnection connection = (HttpsURLConnection) myUrl.openConnection();
            connection.connect();

            int responseCode = connection.getResponseCode();
            String lastPacket = connection.getHeaderField("LastPacket");

            byte fileContent[] = IOUtils.toByteArray((InputStream) connection.getInputStream());
            return fileContent;
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

我想对上面的代码进行单元测试。 所以我使用 MockitoJUnitRunner 编写了 JUnit:

@RunWith(MockitoJUnitRunner.class)
public class EvmlSeviceImplTest {

    @Mock
    private URL url;

    @Mock
    private HttpsURLConnection httpsURLConnection;

    @InjectMocks
    private MyClass myClass;

    @Before
    public void preSetup() {
        try {
            Mockito.doReturn(httpsURLConnection).when(url).openConnection();
            Mockito.doReturn(200).when(httpsURLConnection).getResponseCode();
            Mockito.doReturn("-1").when(httpsURLConnection).getHeaderField("LastPacket");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void testMyFunction() {
        myClass.myFunction("my", "dummy", "data");
    }
}

但这里的问题是 URL 是最终类,而 Mockito 无法监视最终类。既然我们使用的是 MockitoJUnitRunner,那么如何才能做到这一点呢?

我遇到了异常:

org.mockito.exceptions.base.MockitoException: Cannot mock/spy class java.net.URL

最佳答案

让我们仔细看看您的函数以及您尝试测试的内容:

URL myUrl = new URL("https://myUrl"); // (1)
HttpsURLConnection connection = (HttpsURLConnection) myUrl.openConnection(); // (2)
connection.connect(); // (3)

int responseCode = connection.getResponseCode(); // (4)
String lastPacket = connection.getHeaderField("LastPacket");

byte fileContent[] = IOUtils.toByteArray((InputStream) connection.getInputStream()); // (5)

return fileContent;

因此,在第 1、2 和 3 行中,您创建了一个到某个远程资源的连接对象并连接到它。为此,您可以使用 SDK 的类。

然后检查响应代码 (4) 并从流中读取 (5)。同样,您为此使用了 SDK 的标准库。

问题是:您真的想要对我们可以安全地假设正在工作的代码进行单元测试吗?

我要做的是将第 1 到 4 行提取到一个单独的类中,并使用返回您可以读取的流的方法。然后,在您的测试模拟中,根据您的需求进行流式传输。但不要对如此低级的代码进行单元测试。

关于java - JUnit Mockito URL 和 HttpsURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57885951/

相关文章:

Java 并发 - 可运行与线程

java - 将文件上传到 Google 云端硬盘中的特定文件夹

java - ucanaccess 驱动程序是否处理多个并发 java 应用程序?

java - 如何使用泛型参数类型模拟方法

java - Spring 集成测试 : inject @Value while using MockitoJUnitRunner

java - PowerMock 访问私有(private)静态成员

java GUI JLabel

java - 如何测试 SOAP 服务?

java - 使用 JUnit、Spring 4 和 Vaadin 对类进行单元测试时获取 NPE

java - 如何测试是否使用正确的参数调用了方法?