我有一个函数,用于检测特定目录路径是否存在。功能如下:
public boolean isRunningOnSandbox() {
return Files.isDirectory(Paths.get("/mySandbox/cloud/sandbox"));
}
如您所见,它依赖于静态方法isDirectory。在我的团队中,我们不使用PowerMock进行测试。
那么,如何测试此方法?我曾尝试编写如下测试:
@Rule
public TemporaryFolder temporaryFolder;
@Test
public void test() throws IOException {
File parent = new File("/");
temporaryFolder = new TemporaryFolder(parent);
temporaryFolder.create();
File folder = temporaryFolder.newFolder("mySandbox", "cloud", "sandbox");
subject.isRunningOnSandbox();
}
但是,我得到一个错误
ava.io.IOException: Permission denied
因为它不允许我在根目录下创建一个临时文件夹。我想有一种更好的方法来测试此代码,而不是尝试创建一个文件夹。
答案 0 :(得分:1)
有很多方法可以做到,其中之一可能像下面的方法。
假设isRunningOnSandbox
方法在某个类SomeClass
中,然后以这种方式重构该类:
public class SomeClass {
public boolean isRunningOnSandbox() {
return Files.isDirectory(Paths.get(getSanboxPath()));
}
protected String getSanboxPath(){
return "/mySandbox/cloud/sandbox";
}
}
,然后在测试中将您有权访问的另一个目录注入到该类中,例如:
public class SomeClassTest {
class SomeClassToTest extends SomeClass{
String folder;
public SomeClassToTest(String folder){
this.folder = folder;
}
@Override
protected String getSanboxPath(){
return folder;
}
}
static String sandboxFolder = "myTestSandobxFolder";
static Path tempDir;
@BeforeClass
public static void createFolder() throws IOException {
tempDir = Files.createTempDirectory(sandboxFolder);
}
@AfterClass
public static void deleteFolder() throws IOException {
Files.delete(tempDir);
}
@Test
public void IsRunningOnSandbox_shouldReturnTrueWhenPathExists() throws IOException {
//given
SomeClass testedObject = new SomeClassToTest(tempDir.toString());
//when
boolean result = testedObject.isRunningOnSandbox();
//then
assertThat(result).isTrue();
}
@Test
public void IsRunningOnSandbox_shouldReturnFalseWhenPathDoesNotExist() throws IOException {
//given
SomeClass testedObject = new SomeClassToTest("/abcdef123");
//when
boolean result = testedObject.isRunningOnSandbox();
//then
assertThat(result).isFalse();
}
}
答案 1 :(得分:0)
您显示的功能不适合单元测试:通过单元测试,您尝试在孤立的小型软件中查找错误。但是,在此示例代码中,哪些错误可能与其他组件(即Files
组件,Paths
组件和实际文件系统)无关?
您的示例中潜在的错误与“我在调用正确的函数吗?”之类的问题有关。或“我用适当的参数值调用函数吗?”或“执行我调用的函数按预期返回参数”或“我使用的路径也是文件系统中找到的路径”。这不能通过单元测试来检查,而可以通过积分测试来检查。
想像一下您的想法不对。然后,在单元测试中,您还将检查相同的错误路径,并且单元测试将成功。仅当在真实文件系统上运行该测试作为集成测试时,您才能弄清楚您所记住的路径是错误的,并且与文件系统中的实际路径不匹配。