testing - 如何在 void 方法上应用 jUnit 测试

标签 testing methods junit void

我有这门课

@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测试具有重量级依赖关系的类。使用模拟的 HttpServletResponse 类,您可以验证是否为您的失败/成功案例正确设置了状态代码。

您将在使用这些静态方法时遇到一些问题。

代替

Files.copy(Paths.get(chemin, fileName), response.getOutputStream());

你可以使用一个非静态类,然后你可以模拟它

class ResourceCopier {
   public void copy(String dir, String file, OutputStream os) {
     Files.copy(Paths.get(dir, file), os);
   }
}

你的主类使用

private ResourceCopier resourceCopier;

public void loadVideoFile(....) {
   resourceCopier.copy(chemin, fileName, response.getOutputStream());
}

然后在您的测试类中创建您的主要对象,创建 ResourceCopier 和 HttpServletResponse 的 Mock,并使用 @InjectMocks 将它们注入(inject)您的主要对象。 然后,您可以使用 Mockito 的 verify() 方法来确保发生了正确的事情(例如使用 404 代码调用的 response.setStatus)

关于testing - 如何在 void 方法上应用 jUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241245/

相关文章:

ajax - 使用浏览器或操作系统阻止特定的 AJAX 请求

java - 为什么在 Java 中不允许用 Foo(Object[]) 重载 Foo(Object...)?

java - 优化测试用例

Junit Test (Mockito, PowerMock) 一个带有void方法和私有(private)值的类

reactjs - 使用 Recompose 测试 HOC

testing - 是否可以在 Spock 中定义测试依赖项?

swift - 为什么并行测试在 Xcode 10 中默认不可用?

java - 为什么我得到空数组?

Java - 如何限制从特定方法调用方法

unit-testing - 是否有与 NUnit 的 testcase 属性等效的 JUnit?