如何在 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 代码调用)