2

我习惯于 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"}')
    }

    ...
}

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

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

谢谢!

4

1 回答 1

8

您命名了两个 @Before 方法setUp()。孩子的setUp()方法覆盖了父母的方法。所以这条线client = new RESTClient()永远不会被调用。

随便取个名字。

于 2012-07-03T18:50:26.463 回答