Groovy中JUnit@Before方法排序

Groovy中JUnit@Before方法排序,groovy,junit,annotations,Groovy,Junit,Annotations,我习惯于JUnit在超类中运行@Before方法,在子类中运行@Before方法。然而,我有一个从另一个Groovy类继承的Groovy测试类,它们都包含@Before方法;我遇到的问题是,测试类中的@Before方法在其超类中的方法之前运行,我从未初始化的变量中获取NPE(超类应该负责这一点) 超类是这样的: import groovyx.net.http.RESTClient import org.junit.Before abstract class BaseTestClass {

我习惯于JUnit在超类中运行@Before方法,在子类中运行@Before方法。然而,我有一个从另一个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"}')
    }

    ...
}
子类是这样的:

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"}')
    }

    ...
}
这是一个简化版本,但我得到了错误:
java.lang.NullPointerException:无法在子类的setUp()方法中调用null对象的方法post()。你知道是什么导致了这种行为吗?所有的医生都说应该是相反的,我以前从未经历过任何不同

我使用maven故障保护插件junit-4.10和jdk-1.6.031运行。有趣的是,我在同一个地方有其他Groovy测试类(同一个包、同一个项目、同一个目录),它们没有遇到这个问题-方法之前@Before的顺序是正确的;此外,它似乎是确定性的——总是同一个测试类有问题


谢谢

您将两个@Before方法命名为
setUp()
。子对象的
setUp()
方法覆盖父对象的方法。因此,永远不会调用行
client=new RESTClient()


只需选择另一个名称。

…或显式调用
super.setUp()
。我认为最好选择一种机制来链接预测试方法:要么依赖于Before注释并注意将父级的“Before”方法命名为setUp()以外的名称,要么依赖继承,让子级覆盖父级的setUp()但是使用之前只用于终端单元测试。当然!非常感谢。我对继承权进行了一些重构,但没有注意到超类和子类最终都使用了相同的方法名,我真傻!