【问题标题】:How can I write valid JUnit tests when mocking a filepath?模拟文件路径时如何编写有效的 JUnit 测试?
【发布时间】:2016-07-19 10:28:44
【问题描述】:

我正在尝试为一组在网络上使用一些 REST 服务的方法编写一些 JUnit 测试。

一般来说,在我的方法中,我提供了一个文件路径和一个配置作为参数,但我预计随着我的进步,事情会变得更加复杂。

目前,对我来说,为以下之类编写 JUnit 测试的最佳方法是什么:

public Answers changeFileToAnswer(String filePath, String mediaType) {
    File document = new File(filePath);
    Answers answers = restService.changeFileToAnswer(document, mediaType);
    return answers;
}

我可以为这样一个简单的类编写什么样的单元测试?测试 answers 对象将是一个集成测试,因为在这里进行了外部调用,对吗?这里有什么好的做法?有没有办法模拟作为参数传入的文件路径?

注意事项 - 此方法来自 REST 接口,稍后将通过 GUI 公开。我目前正在使用来自 POSTman 的 POST 调用对其进行测试。因此,我传递的是 filePath 的字符串而不是文件对象(因为我无法将其发布到我的服务器)。

谢谢。

【问题讨论】:

  • 好吧,如果您不在方法中执行“new File()”,一切都会变得更容易。例如,为什么不传入一个文件对象?!
  • @GhostCat 我也是这么想的!在我的课堂上,这会导致大量重复,所以我认为这也是不好的做法?我想这是简洁和可测试性之间的折腾?
  • 嗨,Simon,您使用 File 而不是 java.nio.file.Path 有什么原因吗?
  • @LucasT 好吧,目前这是一个将由对服务器的 POST 调用调用的方法。我目前正在使用 POSTman 对其进行测试-如果我使用 java.file.Path 调用,我不相信它会起作用?抱歉 - 我应该提到这一点。马上更新。

标签: java unit-testing junit mocking mockito


【解决方案1】:

测试不一定是集成。您的restService 需要模拟或伪造,因此没有真正的外部调用。 对于模拟文件路径,您可以使用JUnit TemporaryFolder

public class TestClass{
    @Rule
    private TemporaryFolder folder = new TemporaryFolder();

    @Test
    public void testMethod(){
        File tempFile = folder.newFile("myfile.txt");
        classUnderTest.changeFileToAnswer(file.getPath(), mediaType);
    }
}

此规则将在文件系统中创建一个真实文件,该文件将在测试完成执行时被删除。

UPD:您可能还想看看jimfs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2020-02-27
    • 2010-10-31
    • 2021-02-03
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多