iva*_*e94 1 java junit unit-testing
我有创建目录并将文件传输到其中的代码。我想对其进行单元测试。但是问题是当我运行单元测试时,会创建这些目录,但是我不想要那样。我希望代码仅在运行生产环境时才创建这些目录。我已经对此进行了搜索,但是所有搜索结果都建议使用JUnit类TemporaryFolder。但这不是我想要的。我没有在测试用例中创建目录。我只是测试创建它们的代码。因此,不确定TemporaryFolder类如何帮助我。说我有下面的代码
public class Util {
public File getLocation(String location) {
File result = new File(location);
if (!result.exists()) {
result.mkdirs();
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
如何对此类代码进行单元测试?每次我打电话
util.getLocation("base/location");
Run Code Online (Sandbox Code Playgroud)
目录的基础/位置正在创建,但我不想要。仅当我在生产环境中运行代码时才应创建它们。
更新 由于对问题的评论。我决定更新我的问题。首先,getLocation签名有点误导。那不是我正在测试的确切代码,它的时间很长,所以我试图以此传达想法。它的功能基本相同,但问题在于getLocation()不带参数,如上所示。在getLocation内部,调用了另一个方法,该方法将字符串返回路径。这意味着我无法控制用于创建目录的内容。而且,我同时运行生产和开发环境,并且在运行生产代码时创建了这些目录后,即使重新构建了代码也不应删除它们,因为单元测试将在每个构建上运行。
public File getLocationForReports() {
String softwareHome = GeneralUtil.getSoftwareHome();
File path = new Path(softwareHome, "reports").toFile();
if (!path.exists()) {
path.mkdirs();
}
return path;
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的那样,我无法控制GeneralUtil.getSoftwareHome()返回的内容,因此我什至无法发送“ tmp / location”之类的虚拟位置并稍后删除,如果这些目录我也不想删除是在运行生产代码时创建的,因为我会添加一些文件。
我建议您尽一切可能不使用PowerMock进行任何测试。
PowerMock操纵您的生产类;它通常会导致非常奇怪的错误(您可以花数小时来寻找代码中的真正问题);它会杀死您进行报道的能力。
换句话说:对我而言,PowerMock的“需求”在很大程度上转化为:您的设计没有合理的测试结构。与其投资大型丑陋的PowerMock锤,不如花时间重新设计!
就您而言:摆脱对静态方法的调用;确保可以使用依赖注入来为代码提供模拟对象。含义:EasyMock之类的框架允许您创建模拟对象,该对象可以执行您希望它们执行的任何操作。您将这样的“准备好的”模拟传递给被测代码;然后您可以完全控制测试过程。
您会发现,从本质上看,您的问题是生产代码在一处做太多事情。因此,您很难测试它。撕开它,将代码中找到的每个“职责”放入单独的类/方法中;并分别测试。
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |