我有以下代码:
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,作为:
@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
发布于 2019-09-11 11:41:43
让我们仔细看看您的功能以及您尝试测试的内容:
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的行提取到一个单独的类中,并使用一个方法返回您可以读取的流。然后,在您的测试中根据您的需要模拟该流。但不要对这种低级代码进行单元测试。
发布于 2019-09-11 11:02:16
在我看来你的preSetup也是错的。
即使您模拟HttpsURLConnection (httpsURLConnection)和URL (url),这在测试中也没有使用。您不能只在测试或设置中使用" URL“(模拟URL),因为在要测试的方法(myFunction)中,会创建一个新的URL (myUrl)。这个"myUrl“和你嘲笑的"url”不一样。
我会将一个URLConnection作为参数传递给该方法(或者创建第二个函数)。然后,您可以完全控制它,并可以对其进行嘲弄。
https://stackoverflow.com/questions/57885951
复制相似问题