模拟方法中的新对象创建

时间:2018-03-31 20:35:50

标签: java groovy spock

我有这个简单的方法

@Override
public List<DataRule> parseFile(String filename) {
    IFileParser wrapper = new RuleFileParserWrapper();
    return wrapper.parseRuleFile(filename);
}

但是如何在Spock中创建一个模拟new调用的测试?

这样它会尝试使用真正的方法

def "should parse file"() {
    setup:
        def parser = new DefaultRuleParser()
        def wrapper = Mock(RuleFileParserWrapper) { // [new] mock result
            parseRuleFile('filename.txt') >> []
        }
    expect:
        [] == parser.parseFile('filename.txt')
}

我可以使用来自Powermock的expected之类的内容,但我想知道Spock是否有办法做到这一点。

1 个答案:

答案 0 :(得分:2)

每当你需要PowerMock,IMO这是一个难闻的气味,并且你应该重构你的代码。在这种情况下,如果您的应用程序中没有基于注释的DI框架,则可以通过setter或构造函数注入重构依赖注入来解决问题。

有关更详细的说明,请参阅this answer(在页面上搜索字符串“inject”)。

测试不是问题,应用程序代码是!好的测试发现了这样的可测试性问题,因此得出结论和重构。解耦依赖关系总是一个好主意。