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是的