首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JUnit Mockito和HttpsURLConnection

JUnit Mockito和HttpsURLConnection
EN

Stack Overflow用户
提问于 2019-09-11 09:21:38
回答 2查看 2.1K关注 0票数 1

我有以下代码:

代码语言:javascript
复制
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;
    }
}

我想对上面的代码进行单元测试。因此,我使用JUnit编写了MockitoJUnitRunner,作为:

代码语言:javascript
复制
@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:无法模拟/间谍类java.net.URL

EN

回答 2

Stack Overflow用户

发布于 2019-09-11 11:41:43

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

代码语言:javascript
复制
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的行提取到一个单独的类中,并使用一个方法返回您可以读取的流。然后,在您的测试中根据您的需要模拟该流。但不要对这种低级代码进行单元测试。

票数 2
EN

Stack Overflow用户

发布于 2019-09-11 11:02:16

在我看来你的preSetup也是错的。

即使您模拟HttpsURLConnection (httpsURLConnection)和URL (url),这在测试中也没有使用。您不能只在测试或设置中使用" URL“(模拟URL),因为在要测试的方法(myFunction)中,会创建一个新的URL (myUrl)。这个"myUrl“和你嘲笑的"url”不一样。

我会将一个URLConnection作为参数传递给该方法(或者创建第二个函数)。然后,您可以完全控制它,并可以对其进行嘲弄。

//编辑:Mocking a URL in Java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57885951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档