我有以下代码:
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/