【问题标题】:Spock - Mock private fieldSpock - 模拟私人领域
【发布时间】:2020-10-29 11:41:57
【问题描述】:

我必须模拟私有字段:

public class A{
    private final B b;
    public A(){
        this.b = new B(new OtherService)
    }

    public test(){
        int i = b.test()
        if(i == 0)
           b.test1()
        else
           b.test2()
    }
}

我必须为这种类中的方法创建单元测试,并且我必须模拟 B 类,这甚至可能吗?

【问题讨论】:

  • 一般来说,如果班级成员是私人的,他们不会接受测试,除非您有某种无法更改的遗留软件
  • @injecteer 单元测试我不想测试其他类所以可以测试它吗?
  • 展示一些你想要做的测试的例子
  • @injecteer 我添加了我想测试的功能
  • 对不起,但这对我来说似乎不是一个测试。也许作为一个调试游乐场,但绝对不是一个测试。看起来你正在尝试测试模拟,这是你知道的......

标签: java groovy spock


【解决方案1】:

请阅读我的评论 herehere 或在我回答的有关依赖注入 (DI) 的许多其他此类问题中。在您的紧密耦合的应用程序设计中缺乏这些是阻碍您进行有效测试和重构的原因。

所以去重构!确保你的类有一个构造函数或设置器来注入依赖项(这里:你想模拟的B的实例)。

如果您的成员不是最终成员,您可以使用 Groovy-ism,根据我的回答 A a = new A(b: Mock(B)) 在构造函数中使用已知的私有成员名称 here,但这是驱动良好应用程序的丑陋替代方案使用自动化测试进行设计并解耦您的类。如果任何类难以测试,在许多情况下(也在这里),这并不意味着您的测试技能或工具需要变得更好,而是您的应用程序设计存在缺陷。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2019-04-09
    • 2013-06-29
    • 2015-08-03
    • 1970-01-01
    • 2022-06-11
    • 2010-12-20
    相关资源
    最近更新 更多