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

Con*_*nan 1 groovy junit annotations

我习惯于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()
    }
}
Run Code Online (Sandbox Code Playgroud)

子类是这样的:

import org.junit.Before

class TestClass extends BaseTestClass {

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ola*_*laf 7

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

只需选择另一个名字.

  • ...或者明确地调用`super.setUp()`. (3认同)