我有以下简短的代码片段,我尝试通过mockito对其进行单元测试
public String getExecutable()
{
String result = executable;
String ex = !hasExtension() ? executable + ".bat" : executable;
File f = new File( dir, ex );
if ( f.isFile() )
{
result = ex;
}
return result;
}
dir
是类File
的一个实例,它是通过构造函数提供给类的,所以没问题。只有这一行:
File f = new File( dir, ex );
if ( f.isFile() ) {
..
}
那么是否有机会通过 Mockito 模拟它以对其进行一些测试,以便我可以控制isFile()
的结果?知道吗?
看起来dir
是包含getExecutable()
的类的成员变量?您可以将dir
抽象为可能包含文件的内容:
class FileContainer {
private final File dir;
public FileContainer(File aDir) { dir = aDir; }
public boolean contains(String aFile) {
return new File(dir, aFile).isFile();
}
}
让您的类保存这些FileContainer
对象之一,并使用其 contains()
函数来测试文件。安排注入FileContainer
的模拟版本进行测试。模拟版本将覆盖contains()
并返回您想要的任何内容。
一种想法是将new File( dir, ex )
提取到一个新的受保护方法中,并在测试期间覆盖它以返回模拟。
public class YourClass
{
// ...
public String getExecutable()
{
String result = executable;
String ex = !hasExtension() ? executable + ".bat" : executable;
File f = createFile( dir, ex );
if ( f.isFile() )
{
result = ex;
}
return result;
}
@VisibleForTesting
protected File createFile( String ex, String dir )
{
return new File( dir, ex );
}
}
在执行测试之前:
@Test
public void shouldReturnExecutableFile()
{
YourClass subject = new YourClass()
{
@Override
protected File createFile( String ex, String dir )
{
// return a mock for File
}
};
}
它是Michael Feathers在《Effective with Legacy Code》中介绍的技术之一。