当前位置: 首页 > 知识库问答 >
问题:

如何在JUnit中模拟文件.copy方法

郁博学
2023-03-14
public String uploadFile(MultipartFile file) {
    try {
    String fileName = file.getOriginalFilename()
        // Copy file to the target location (Replacing existing file with the same name)
        Path targetLocation = Paths.get("uploadPath" + File.separator + StringUtils.cleanPath(fileName));
        Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);

        return fileName;
    } catch (IOException ex) {
        throw new FileStorageException("Not able to upload", ex);
    }
}

但是对于这个源代码,我不能编写JUnit测试,因为不能模拟files类。对于模拟final类,我们可以使用PowerMock,它支持模拟静态和final方法。但在这里,如果我使用PowerMock,它仍然不是嘲弄。我使用的是Spring Framework5.2.1.版本,这个版本的JUnit有没有什么变化来模拟最终类或方法?或者任何一个可以帮助我编写此代码的单元测试(我使用的版本是Spring Framework5.2.1和JUnit4.12)。

共有1个答案

叶茂才
2023-03-14

实际上,只有使用PowerMock或PowerMockito这样的工具才能模拟静态类和final类,它与JUnit或Spring框架无关。

我认为您不应该模拟files.copy操作。请考虑以下策略:

定义一个用于处理文件的接口,一种DAO但用于文件系统:

public interface FileSystemDAO {
   void copy(InputStream is, Path target, StandardCopyOption ... options);
}

public class FileSystemDAOImpl implements FileSystemDAO {
    void copy(InputStream is, Path target, StandatadCopyOption ... options) {
      Files.copy(...)
    }
}

class MySampleUploadService {

 private final FileSystemDAO fileSystemDao;

 public MySampleUploadService(FileSystemDAO dao) {
      this.fileSystemDao = dao;
 }
 public String uploadFile(MultipartFile file) {
     try {
     String fileName = file.getOriginalFilename()
         // Copy file to the target location (Replacing existing file with the same name)
         Path targetLocation = Paths.get("uploadPath" + File.separator + 
 StringUtils.cleanPath(fileName));
         fileSystemDao.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);

        return fileName;
    } catch (IOException ex) {
        throw new FileStorageException("Not able to upload", ex);
    }
 }

}
 类似资料:
  • 我有一种方法可以将文件上传到Amazon S3。我正在尝试为此方法编写JUnit,但在S3AsyncClient上获取NullPointerException: 我的班级: S3UploadData类对象的输入:` @Getter@allargsconstuctor 你能帮我写Junit for uploadFile方法吗?

  • 我有一个Spring组件我想测试,这个组件有一个autowired属性,为了单元测试的目的,我需要更改它。问题是,这个类在后构造方法中使用autowired组件,所以我不能在它实际使用之前替换它(即通过反射)。 我该怎么做? 在调用postconstruct方法之前,有什么方法可以用其他东西替换资源吗?喜欢告诉Spring JUnit runner autowire不同的实例吗?

  • 我想让你问几个问题,向你请教: 我想测试我的公共方法(我使用Spring Boot、Mockito、JUnit): 非常感谢你所有的提示! 向马修问好

  • 问题内容: 我有一个Java命令行程序。我想创建JUnit测试用例以进行模拟。因为当我的程序运行时,它将进入while循环并等待用户输入。如何在JUnit中模拟呢? 问题答案: 从技术上讲,可以进行切换,但是总的来说,不直接在代码中调用它,而是添加一层间接层,这样输入源就可以从应用程序的某个位置进行控制,这样会更健壮。确切地讲,这是实现的详细信息-依赖项注入的建议很好,但是你不一定需要引入第三方框

  • 问题内容: 我在源代码中使用了BufferedWriter对象 我正在尝试在我的测试用例中模拟它,如下所示: 但是,BufferedWriter不会被嘲笑,它总是进入实际的实现中。是因为它不能模拟BufferedWriter,因为它是一个具体的类吗?这是否意味着无法模拟任何java.io类?有没有办法模拟它,或者我做错了什么? 问题答案: ,你可以嘲笑的Java IO类(包括它们的构造,所以未来的

  • 我有一个带有rest apiendpoint的应用程序。我想为此编写测试用例。它遵循MVC架构。对于其中一个endpoint,我想在我的DAO类中模拟一个方法。 我的测试类的示例代码是: 此控制器将调用具有要模拟的方法的DAO层。我尝试在我的Test config类中使用如下mockito: 这样做的问题是,它模拟了整个DAO bean,所以对于其余的endpoint,它不调用DAO类方法,我的测