【问题标题】:mock new object creation in the method在方法中模拟新对象的创建
【发布时间】:2018-03-31 20:35:50
【问题描述】:

我有这个简单的方法

@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 有没有办法做到这一点。

【问题讨论】:

    标签: java groovy spock


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,基本上你搞定了。良好的可测试性不是证明,而是解耦和组件化的指标之一。
    猜你喜欢
    • 2020-03-26
    • 2017-11-06
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多