java - Spock - 模拟私有(private)字段

标签 java groovy spock

我必须模拟私有(private)字段:

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 类,这在这里可能吗?

最佳答案

请阅读我的评论herehere或者在许多其他此类问题中,我回答了有关依赖注入(inject)(DI)的问题。紧密耦合的应用程序设计中缺乏这一点会阻止您有效地进行测试和重构。

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

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

关于java - Spock - 模拟私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64590395/

相关文章:

java - 我怎样才能使用断言来测试这个java代码?

java - 从 ZipInputStream 获取特定文件

maven - 如何配置 Maven 插件来运行 spock 和 junit5 测试

java - 使用 HTTPBuilder 并获取 "java.net.SocketException: No buffer space available (maximum connections reached?): connect"

java - 在 maven 生命周期中运行 JUnit5 和 Spock

java - 如何为数据集描述创建 spock 风格的 DSL?

java - 有没有办法告诉 JVM 当前正在使用哪种 GC 算法

java - 使用反射制作对象

java - 在 Java 中,Date 类型可以只包含 MM-dd-yyyy 还是只包含 hh :mm:ss?

git - 获取触发管道作业的用户名(手动或 scm 触发器)