java - 在方法中模拟新对象的创建

标签 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 来做到这一点。

最佳答案

每当你需要 PowerMock 时,在我看来,这都是一种难闻的气味,并且是你应该重构你的代码的明确信号。在这种情况下,如果您的应用程序中没有基于注释执行此操作的 DI 框架,则可以通过重构依赖项注入(inject)来解决问题,可以通过 setter 或构造函数注入(inject)。

参见this answer获取更详细的解释(在页面上搜索字符串“inject”)。

测试不是问题,应用程序代码才是问题!好的测试可以发现这样的可测试性问题,因此得出结论并重构。解耦依赖始终是一个好主意。

关于java - 在方法中模拟新对象的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592164/

相关文章:

grails - 使用Spock进行集成测试

java - Boolean.getBoolean ("true") 返回 false

java - 如何在 Java 中将文本文件从类路径加载到 String[]

groovy - 在SoapUI免费版中创建脚本库

unit-testing - 参数化 Spock 设置

grails - 为 UL LI 创建 Geb 模块

java - PaintComponent显示不清楚

java - 让java与C++程序通信

jenkins - Groovy withEnv 插值不起作用

json - 在Groovy中使用jsonbuilder修改json