模拟一个以临时文件为输入的方法

时间:2014-09-08 12:28:31

标签: java unit-testing mocking mockito

我有一个如下代码:

public start() {
    ..............
    ..............
    ImpAbc abc = extract(ImplObj);
    ...............
}

public ImpAbc extract(Impl ImplObj) {
    ................
    File BuildPath = File.createTempFile("xyz", ".zip");
    ImpAbc abc = ImplObj.downloadImp(Integer.parseInt(rev.trim()), BuildPath,
                conn);  
    .................
    return abc;
}

我正在测试调用start()方法的方法extract()。我想模拟方法downloadImp(..),因为它是第三方API,并在内部调用许多其他方法。

但问题是downloadImp(..)将临时文件作为输入,当我使用when().thenReturn()时,如下所示,它不会调用mocked方法,因为临时文件每个都有一个唯一的名称时间。

我尝试的是:

Impl mockImplObj = mock(Impl.class);
ImpAbc mockImpAbc = mock(ImpAbc.class);
when(mockImplObj.downloadImp(Integer.parseInt(rev.trim()), File.createTempFile("xyz", ".zip"),
                mockconn).thenReturn(mockImpAbc);

任何人都可以帮忙解决问题吗?

2 个答案:

答案 0 :(得分:0)

问题的根源在于你对File.createTempFile有一个静态依赖关系,而静态依赖关系是用模拟进行单元测试的致命错误。

extract()之外创建临时文件并将其传入。

public start() {
    ...
    File buildPath = File.createTempFile("xyz", ".zip");
    ImpAbc abc = extract(ImplObj, buildPath);
}

public ImpAbc extract(Impl ImplObj, File buildPath) {
    ...
    ImpAbc abc = ImplObj.downloadImp(Integer.parseInt(rev.trim()), buildPath,
            conn);  
    ...
    return abc;
}

现在,您的测试方法中没有依赖File.createTempFile

答案 1 :(得分:0)

使用任何:

import org.mockito.Matchers;

...

when(mockImplObj.downloadImp(Integer.parseInt(rev.trim()), Matchers.any(File.class)).thenReturn(mockImpAbc);