在Groovy中使用JUnit @Before方法排序

时间:2012-07-03 18:14:11

标签: groovy junit annotations

我习惯于在子类中的@Before方法之前在超类中运行@Before方法的JUnit。但是,我有一个继承自另一个Groovy类的Groovy测试类,它们都包含@Before方法;我遇到的问题是测试类中的@Before方法在其超类中的方法之前运行,并且我从未初始化的变量获得NPE(超类应该处理它)。

超类是这样的:

import groovyx.net.http.RESTClient
import org.junit.Before

abstract class BaseTestClass {
    def client

    @Before
    void setUp() {
        client = new RESTClient()
    }
}

子类是这样的:

import org.junit.Before

class TestClass extends BaseTestClass {

    @Before
    void setUp() {
        client.post(path: '/entity', body: '{"id":"test"}')
    }

    ...
}

这是一个简化版本,但我在子类的setUp()方法中得到错误:java.lang.NullPointerException: Cannot invoke method post() on null object。什么可能导致这种行为?所有的文档都说它应该是反过来的,我以前从未经历过任何不同的事情。

我正在使用maven-failsafe-plugin,junit-4.10和jdk-1.6.0_31。有趣的是,我有其他Groovy测试类在同一个地方(相同的包,相同的项目,相同的目录)没有遇到这个问题 - @Before方法的顺序是正确的;此外,它似乎是确定性的 - 它始终是具有问题的相同测试类。

谢谢!

1 个答案:

答案 0 :(得分:7)

您命名了两个@Before方法setUp()。孩子的setUp()方法会覆盖父母的方法。因此永远不会调用client = new RESTClient()行。

选择另一个名字。