Java JUnit Mockito URL和HttpsURLConnection

Java JUnit Mockito URL和HttpsURLConnection,java,junit,mockito,Java,Junit,Mockito,我有以下代码: public byte[] myFunction(String s1, String s2, String s3) { try { URL myUrl = new URL("https://myUrl"); HttpsURLConnection connection = (HttpsURLConnection) myUrl.openConnection(); connectio

我有以下代码:

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:无法模拟/间谍类 java.net.URL


在我看来,你的预设也是错误的

尽管您模拟了HttpsURLConnection(HttpsURLConnection)和URL(URL),但在测试中没有使用它。 在测试或设置中不能只使用“url”(模拟url),因为在要测试的方法(myFunction)中,会创建一个新的url(myUrl)。这个“myUrl”与您嘲笑的“url”不同

我会将URLConnection作为参数传递给该方法(或创建第二个函数)。然后你就可以完全控制它,并可以模仿它

//编辑:

让我们更仔细地看看您的功能和您尝试测试的内容:

URL myUrl=新URL(“https://myUrl"); // (1)
HttpsURLConnection连接=(HttpsURLConnection)myUrl.openConnection();//(2)
connection.connect();//(3)
int responseCode=connection.getResponseCode();//(4)
字符串lastPacket=connection.getHeaderField(“lastPacket”);
byte fileContent[]=IOUtils.toByteArray((InputStream)connection.getInputStream());//(5)
返回文件内容;
因此,在第1、2和3行中,您创建了一个到某个远程资源的连接对象并连接到它。您可以使用SDK的类来实现这一点

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

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


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

像模拟其他类一样模拟最终类,问题是什么,请具体解释。我已经模拟了最终类URL,如上面代码所示。我遇到了一个异常:
无法模拟/spy类java.net.URL
您正在使用Mockito 2.0??对吧???@VishwaRatna是的