我有代码创建目录并将文件传输给它。我想对它进行单元测试。但问题是,当我运行单元测试时,这些目录已创建,但我不想这样做。我希望代码只在运行生产环境时才创建这些目录。我已经用Google搜索了这个,但所有搜索结果都显示了JUnit类的TemporaryFolder。但这不是我想要的。我不在我的测试用例中创建目录。我只是测试创建它们的代码。所以我不确定TemporaryFolder类如何帮助我。说我有下面的代码
public class Util {
public File getLocation(String location) {
File result = new File(location);
if (!result.exists()) {
result.mkdirs();
}
return result;
}
}
如何对这些代码进行单元测试?我每次打电话
util.getLocation("base/location");
正在创建目录base / location但我不想要这样。它们只应在我在生产环境中运行代码时创建。
更新 由于对问题的评论。我决定更新我的问题。首先,getLocation签名有点误导。这不是我正在测试的确切代码,它有点长,所以我试图传达这个想法。它的功能基本相同,但问题是getLocation()没有参数,如上所示。在getLocation内部调用另一个方法,该方法将字符串返回到路径。这意味着我无法控制创建目录时使用的内容。此外,我还运行生产和开发环境,一旦在运行生产代码时创建了这些目录,即使重建代码也不应删除它们,因为单元测试将在每次构建时运行。
public File getLocationForReports() {
String softwareHome = GeneralUtil.getSoftwareHome();
File path = new Path(softwareHome, "reports").toFile();
if (!path.exists()) {
path.mkdirs();
}
return path;
}
正如您在上面所看到的,我无法控制GeneralUtil.getSoftwareHome()返回的内容,因此我甚至无法发送虚拟位置,如" tmp / location"如果在运行生产代码时创建这些目录,我也不想删除这些目录,因为我有一些文件。
答案 0 :(得分:4)
我建议尽你所能不使用PowerMock进行任何测试。
PowerMock操纵您的生产类;它经常导致真正奇怪的错误(你可以找几个小时,而不会在代码中发现真正的问题);它会影响你做报道的能力。
换句话说:对我而言,PowerMock的“需求”很大程度上转化为:您的设计结构不允许进行合理的测试。而不是投资到丑陋的大型PowerMock锤子......你最好花时间重新设计你的设计!
在你的情况下:摆脱对静态方法的调用;确保您可以使用依赖注入,以便为您的代码提供模拟对象。含义:像EasyMock这样的框架允许您创建模拟对象,无论您希望它们做什么。你将这些“准备好的”模拟传递给你测试的代码;然后你就可以完全控制你的测试过程中会发生什么。
你看,实质上你的问题是你的生产代码在一个地方做了太多事情;因此你很难测试它。撕开它,将代码中的每个“责任”放入单独的类/方法中;并单独测试。
答案 1 :(得分:0)
我建议使用PowerMock来创建测试。 有两种方法可以做到这一点。两者都需要PowerMock,测试需要注释如下: @RunWith(PowerMockRunner.class) @PrepareForTest(您要测试的类 .class)
首先,您可以尝试使用powermockito模拟对GeneralUtil.getSoftwareHome()的静态调用。 PowerMockito mock single static method and return object
第二个选项是模拟Path对象的构造函数以及它返回的调用: mockito mock a constructor with parameter
这样您就可以测试代码的功能。