在代码中创建文件实例



我有以下简短的代码片段,我尝试通过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》中介绍的技术之一。

相关内容

  • 没有找到相关文章

最新更新