如何在 void 方法上应用 jUnit 测试
How to apply jUnit test on a void method
我有这个class
@Value("${norsys.loadfile.directory}")
private String chemin;
@RequestMapping(value = "/{fileName:.+}", method = RequestMethod.GET)
@ResponseBody()
public void loadVideoFile(@PathVariable("fileName") String fileName,HttpServletResponse response) {
try {
response.setContentType("video/mp4");
Files.copy(Paths.get(chemin, fileName), response.getOutputStream());
response.flushBuffer();
} catch (java.io.FileNotFoundException e) {
response.setStatus(HttpStatus.NOT_FOUND.value());
} catch (Exception e) {
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
}
}
我不知道如何应用 JUnit 测试来保持高覆盖率,希望您能给我一个想法,谢谢
一般情况下,您可以使用 Mockito http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html 来测试具有重量级依赖项的 classes。使用模拟 HttpServletResponse class,您可以验证状态代码是否针对您的 failure/success 个案例进行了适当设置。
您将 运行 遇到一些使用这些静态方法的问题。
而不是
Files.copy(Paths.get(chemin, fileName), response.getOutputStream());
您可以使用非静态 class,然后您可以对其进行模拟
class ResourceCopier {
public void copy(String dir, String file, OutputStream os) {
Files.copy(Paths.get(dir, file), os);
}
}
您的主要class用途
private ResourceCopier resourceCopier;
public void loadVideoFile(....) {
resourceCopier.copy(chemin, fileName, response.getOutputStream());
}
并且在你的测试中 class 你创建你的主要对象,创建一个 ResourceCopier 和 HttpServletResponse 的 Mock 并使用 @InjectMocks 将它们注入你的主要对象。
然后你可以使用 Mockito 的 verify() 方法来确保正确的事情发生了(比如 response.setStatus 用 404 代码调用)
我有这个class
@Value("${norsys.loadfile.directory}")
private String chemin;
@RequestMapping(value = "/{fileName:.+}", method = RequestMethod.GET)
@ResponseBody()
public void loadVideoFile(@PathVariable("fileName") String fileName,HttpServletResponse response) {
try {
response.setContentType("video/mp4");
Files.copy(Paths.get(chemin, fileName), response.getOutputStream());
response.flushBuffer();
} catch (java.io.FileNotFoundException e) {
response.setStatus(HttpStatus.NOT_FOUND.value());
} catch (Exception e) {
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
}
}
我不知道如何应用 JUnit 测试来保持高覆盖率,希望您能给我一个想法,谢谢
一般情况下,您可以使用 Mockito http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html 来测试具有重量级依赖项的 classes。使用模拟 HttpServletResponse class,您可以验证状态代码是否针对您的 failure/success 个案例进行了适当设置。
您将 运行 遇到一些使用这些静态方法的问题。
而不是
Files.copy(Paths.get(chemin, fileName), response.getOutputStream());
您可以使用非静态 class,然后您可以对其进行模拟
class ResourceCopier {
public void copy(String dir, String file, OutputStream os) {
Files.copy(Paths.get(dir, file), os);
}
}
您的主要class用途
private ResourceCopier resourceCopier;
public void loadVideoFile(....) {
resourceCopier.copy(chemin, fileName, response.getOutputStream());
}
并且在你的测试中 class 你创建你的主要对象,创建一个 ResourceCopier 和 HttpServletResponse 的 Mock 并使用 @InjectMocks 将它们注入你的主要对象。 然后你可以使用 Mockito 的 verify() 方法来确保正确的事情发生了(比如 response.setStatus 用 404 代码调用)