使用 mockito 创建单元测试
Create unit test using mockito
我正在尝试为以下功能 setUrl 创建一个 junit 测试用例。我怎样才能用 mockito
模拟 java url class
public void setUrl(String url) {
this.url = URLUtil.processURL(url);
try {
URL dst = new URL(this.url);
InputStream is = dst.openStream();
Scanner scanner = new Scanner(is);
StringBuilder sb = new StringBuilder();
while(scanner.hasNextLine())
sb.append(scanner.nextLine()).append("\n");
if (validate(sb.toString())) {
--------
} else {
}
is.close();
scanner.close();
} catch (Exception ex) {
}
}
private boolean validate(String content) {
JSONParser parser = new JSONParser();
Boolean isJsonValid = false;
JSONObject json = null;
try {
--------
//json validation goes here
} catch (Exception e) {
}
return isJsonValid;
}
代码已尝试
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments(sourceUrl).thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
但我不确定我的做法是否正确。
两个答案:
- 当 mocking 调用
new()
时,你 simply 必须遵循 all 强制性步骤,例如概述 here。含义:您需要使用@PrepareForTest 注释和正确的运行器。
- 但真正的要点是:您一开始就不应该调用
new()
。这使得测试代码变得更加困难。它迫使您依赖 PowerMock(ito)。而这种依赖性让你的生活变得更加艰难!
意思是:模拟调用 new()
在技术上是可行的,而且很直接,您只需要按照说明进行操作即可。但更好的长期解决方案是重新编写您的生产代码,以便您可以在没有 PowerMock(ito) 的情况下对其进行测试。例如,通过使用某种依赖注入,为您的测试代码提供一些 URL 对象。
我正在尝试为以下功能 setUrl 创建一个 junit 测试用例。我怎样才能用 mockito
模拟 java url class public void setUrl(String url) {
this.url = URLUtil.processURL(url);
try {
URL dst = new URL(this.url);
InputStream is = dst.openStream();
Scanner scanner = new Scanner(is);
StringBuilder sb = new StringBuilder();
while(scanner.hasNextLine())
sb.append(scanner.nextLine()).append("\n");
if (validate(sb.toString())) {
--------
} else {
}
is.close();
scanner.close();
} catch (Exception ex) {
}
}
private boolean validate(String content) {
JSONParser parser = new JSONParser();
Boolean isJsonValid = false;
JSONObject json = null;
try {
--------
//json validation goes here
} catch (Exception e) {
}
return isJsonValid;
}
代码已尝试
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments(sourceUrl).thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
但我不确定我的做法是否正确。
两个答案:
- 当 mocking 调用
new()
时,你 simply 必须遵循 all 强制性步骤,例如概述 here。含义:您需要使用@PrepareForTest 注释和正确的运行器。 - 但真正的要点是:您一开始就不应该调用
new()
。这使得测试代码变得更加困难。它迫使您依赖 PowerMock(ito)。而这种依赖性让你的生活变得更加艰难!
意思是:模拟调用 new()
在技术上是可行的,而且很直接,您只需要按照说明进行操作即可。但更好的长期解决方案是重新编写您的生产代码,以便您可以在没有 PowerMock(ito) 的情况下对其进行测试。例如,通过使用某种依赖注入,为您的测试代码提供一些 URL 对象。