【问题标题】:Override test in spockspock中的覆盖测试
【发布时间】:2017-11-26 03:33:54
【问题描述】:

我有一个用基类编写的测试

abstract class BaseEdgeSpec extends Specification {
    Edge edge
    Edge switched
    abstract def 'equals with both vertices switched'()
}

还有两个类我想实现这个测试。一个用于正常边缘

class EdgeTestSpec extends BaseEdgeSpec {
    def setup() {
        edge = new Edge(one:'step1', two:'step2')
        switched = new Edge(one: 'step2', two: 'step1')
    }
    @Override
    def 'equals with both vertices switched'() {
        expect:
        edge == switched
    }
}

还有一个用于有向边

public class DirectedEdgeSpec extends BaseEdgeSpec {
    def setup() {
        edge = new DirectedEdge(one:'step1', two:'step2')
        switched = new DirectedEdge(one:'step2', two:'step1')
    }
    @Override
    def 'equals with both vertices switched'() {
        expect:
        edge != switched
    }
}

当我运行测试时,我得到了这些错误

/etc/user/john/projects/graph-dsl/src/test/groovy/nondsl/edges/DirectedEdgeSpec.groovy: 6: Can't have an abstract method in a non-abstract class. The class 'nondsl.edges.DirectedEdgeSpec' must be declared abstract or the method 'java.lang.Object equals with both vertices switched()' must be implemented.
 @ line 6, column 1.
   public class DirectedEdgeSpec extends BaseEdgeSpec {
   ^
/etc/user/john/projects/graph-dsl/src/test/groovy/nondsl/edges/DirectedEdgeSpec.groovy: 16: Method '$spock_feature_1_0' from class 'nondsl.edges.DirectedEdgeSpec' does not override method from its superclass or interfaces but is annotated with @Override.
 @ line 16, column 5.
       @Override
       ^
/etc/user/john/projects/graph-dsl/src/test/groovy/nondsl/edges/EdgeTestSpec.groovy: 16: Method '$spock_feature_1_0' from class 'nondsl.edges.EdgeTestSpec' does not override method from its superclass or interfaces but is annotated with @Override.
 @ line 16, column 5.
       @Override
       ^
3 errors

如何正确覆盖这些测试?

【问题讨论】:

    标签: groovy spock


    【解决方案1】:

    你可能做不到。 Spock 转换所有“功能方法”(您的测试),以便它们最终在字节码中被称为 $spock_feature_%d_%d。因此,错误消息 “Method '$spock_feature_1_0' [...] 不会覆盖其超类或接口中的方法,而是使用 @Override 进行注释。”

    org.spockframework.compiler.SpecParser.isFeatureMethod(MethodNode) org.spockframework.compiler.SpecRewriter.createInternalName(FeatureMethod)

    作为覆盖的替代方法,您仍然可以将测试逻辑提取到超类方法并从子类的测试中调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-28
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多