Java 如何对具有可传递依赖项的函数进行单元测试

Java 如何对具有可传递依赖项的函数进行单元测试,java,unit-testing,mockito,Java,Unit Testing,Mockito,假设下面的类拥有两个对象,一个用于修改文档,另一个用于加载和存储文档,那么正确的单元测试应该是什么样的。对于测试,我使用了jUnit5和Mockito 公共类报告器{ 私有最终修改器修改器; 私人最终存储; 公共报告器(修改器,存储){ this.modifier=修饰符; 这个.存储=存储; } 公共列表修改(){ List modificationReports=新建LinkedList(); for(文档:storage.getAll()){ //修改当前文档,保存新版本并删除旧版本 修改

假设下面的类拥有两个对象,一个用于修改文档,另一个用于加载和存储文档,那么正确的单元测试应该是什么样的。对于测试,我使用了
jUnit5
Mockito

公共类报告器{
私有最终修改器修改器;
私人最终存储;
公共报告器(修改器,存储){
this.modifier=修饰符;
这个.存储=存储;
}
公共列表修改(){
List modificationReports=新建LinkedList();
for(文档:storage.getAll()){
//修改当前文档,保存新版本并删除旧版本
修改人。修改(文件);
保存(文件);
存储。删除(文档);
//生成报告
报告修改报告=新报告();
修改报告。设置修改文件(文件);
modificationReport.setMessage(“从“+Utils.getNiceFileName(文档)”获取);
modificationReport.setExecutionTime(LocalDateTime.now());
modificationReports.add(modificationReport);
}
返回修改报告;
}
}

我有以下关注。我知道的良好实践是,模拟对象不应该返回模拟。然后,我的
storage.getAll
方法应该为每个循环返回什么,以便生成报告的以下代码有有效的对象提供给
report
对象和
Utils.getNiceFileName
静态方法


另外,如何处理
LocaldateTime.now()
之后在断言它应该是哪个值时的问题。

因此,如果您不想从
storage.getAll()返回mock,请返回存根?像是
文档的列表吗?至于
LocaldateTime
使用
Assertions::notNull
进行测试,以便在其中设置一些字段,我可以返回类
Document
的对象列表,但我的测试不会同时测试静态方法
Utils.getNiceFileName
的功能。另外,我已经读到在方法中使用
new
是一种硬依赖,应该避免。尝试以某种方式将报表的创建移到这个方法之外,这是一个好的设计吗?可以转换为静态方法“Report::buildReportFromDocument”,或者以类型为
ReportBuilder
的对象的形式为该类提供另一个依赖项。或者,这会带来很多复杂性和粒度。
Utils.getNiceFileName
始终可以使用
Mockito::mockStatic
进行模拟。老实说,我在测试你目前拥有的东西时没有发现任何问题。你能解释一下我如何模拟这种静态方法吗?我知道如何单独模拟静态方法来测试其功能,但我不知道如何将模拟的方法“注入”到我的修改方法中。