我有这个简单的方法
@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 来做到这一点。
最佳答案
每当你需要 PowerMock 时,在我看来,这都是一种难闻的气味,并且是你应该重构你的代码的明确信号。在这种情况下,如果您的应用程序中没有基于注释执行此操作的 DI 框架,则可以通过重构依赖项注入(inject)来解决问题,可以通过 setter 或构造函数注入(inject)。
参见this answer获取更详细的解释(在页面上搜索字符串“inject”)。
测试不是问题,应用程序代码才是问题!好的测试可以发现这样的可测试性问题,因此得出结论并重构。解耦依赖始终是一个好主意。
关于java - 在方法中模拟新对象的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592164/