java—是否可以使用jmockit模拟局部变量?

u4dcyp6a  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(401)

试验装置如下:

@Component(value = "UnitUnderTest")
public class UnitUnderTest {

    @Resource(name = "propertiesManager")
    private PropertiesManager prop;

    public List<String> retrieveItems() {
        List<String> list = new ArrayList<String>();
        String basehome = prop.get("FileBase");
        if (StringUtils.isBlank(basehome)) {
            throw new NullPointerException("basehome must not be null or empty.");
        }

        File target = new File(basehome, "target");
        String targetAbsPath = target.getAbsolutePath();
        File[] files = FileUtils.FolderFinder(targetAbsPath, "test");//A utility that search all the directories under targetAbsPath, and the directory name mush match a prefix "test"

        for (File file : files) {
            list.add(file.getName());
        }
        return list;
    }
}

测试用例如下:

public class TestExample {
    @Tested
    UnitUnderTest unit;
    @Injectable
    PropertiesManager prop;

    /**
     * 
     * 
     */
    @Test
    public void retrieveItems_test(@NonStrict final File target,@Mocked FileUtils util){
        new Expectations(){
            {
                prop.get("FileBase");
                result="home";
                target.getAbsolutePath();
                result="absolute";
                FileUtils.FolderFinder("absolute", "test");
                result=new File[]{new File("file1")};
            }
        };
        List<String> retrieveItems = logic.retrieveItems();
        assertSame(1, retrieveItems.size());
    }
}

它失败了。retrieveitems的实际result为空。我发现“fileutils.folderfinder(targetabspath,“test”)”总是返回一个空文件[]。真奇怪。
可能是因为我还模拟了文件示例“target”。如果我只模仿静态方法fileutils.folderfinder,它就可以正常工作。
有人知道问题出在哪里吗?有没有可能像我在这里要求的那样模拟一个局部变量示例?比如这个目标示例?
谢谢!

drkbr07n

drkbr07n1#

问题是我应该定义要模拟的方法。

@Test
    public void retrieveItems_test(@Mocked(methods={"getAbsolutePath"}) final File target,@Mocked FileUtils util){
        new Expectations(){
            {
                prop.get("FileBase");
                result="home";
                target.getAbsolutePath();
                result="absolute";
                FileUtils.FolderFinder("absolute", "test");
                result=new File[]{new File("file1")};
            }
        };
        List<String> retrieveItems = logic.retrieveItems();
        assertSame(1, retrieveItems.size());
    }

这样就好了。

相关问题