java - 测试类中的 Spock 框架覆盖方法

标签 java unit-testing groovy mocking spock

测试类:

public class ClassForTest {

    public String hello(){
        return "hello " + getClassName();
    }

    public String getClassName(){
        return ClassForTest.class.getName();
    }    

}

Spock 类:

    class ClassForSpockTest extends Specification{
    def setupSpec(){ 
       ClassForTest.metaClass.getClassName={"ClassForSpockTest"} 

    }

    def "override test"(){
        setup:
        ClassForTest cft = new ClassForTest()   

        expect:
        cft.getClassName()  == "ClassForSpockTest"
    }

    def "mock test"(){
        setup:
        ClassForTest cft = new ClassForTest()   

        expect:
        cft.hello() == "hello ClassForSpockTest"
    }


}

覆盖测试测试通过! 模拟测试崩溃,cft.hello() 返回“hello ClassForTest”

最佳答案

您不能使用元类从该类中的另一个方法覆盖 Java 类中的方法调用。这是 spock、Java 和 groovy 的限制。在这种情况下,您必须使用其他模拟技术。例如,您可以使用子类化:

 setup:
 ClassForTest cft = new ClassForTest() {
     String getClassName() {"ClassForSpockTest"} 
 }

关于java - 测试类中的 Spock 框架覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857403/

相关文章:

c++ - 如何模拟 boost 抛出异常?

unit-testing - 将 HavePropertyMatcher 用于 ScalaTest 中的集合元素?

arrays - Groovy,如何使用索引迭代列表

java - 每次加载类或找到资源时如何执行操作?

Java 双重比较与字符串比较

java - 在 Java 上制作数据结构的最惯用方法

unit-testing - 团队 build 练习来教授编写单元测试

java - 如何避免 JComboBox 中的重复值?

grails - 我需要在Grails中返回 “render”吗?

grails - 如何在 grails 响应中添加状态消息