JUnit + Maven + Eclipse:为什么@BeforeClass不起作用?

时间:2010-07-18 06:33:29

标签: eclipse junit

我正在使用JUnit 4,Maven 2和最新的Eclipse。问题很简单:我想在执行测试之前执行一些设置(连接到数据库)。

我在许多不同的地方尝试过@BeforeClass,但是Eclipse和Maven都忽略了这一点。有关完成此初始设置的任何帮助吗?

谢谢!

public abstract class BaseTestCase extends TestCase {

 @BeforeClass
    public static void doBeforeClass() throws Exception {

   System.out.println("No good @BeforeClass");

   // DO THE DATABASE SETUP

    }
}

现在测试扩展了BaseTestCase:

public class LoginActionTest extends BaseTestCase {

 @Test
 public void testNothing() {

  System.out.println("TEST HERE");

  assertEquals(true, true);
 }
}

Maven和Eclipse只是忽略了我的@BeforeClass ???在测试之前执行设置的任何其他方式?

3 个答案:

答案 0 :(得分:11)

Sergio,你是正确的扩展TestCase导致问题。如果扩展TestCase,JUnit会将您的测试类视为旧的(前JUnit 4类)并选择org.junit.internal.runners.JUnit38ClassRunner来运行它。 JUnit38ClassRunner不了解@BeforeClass注释。查看runnerForClass AllDefaultPossibilitiesBuilder方法的源代码和runnerForClass JUnit3Builder方法的详细信息。

注意:此问题与Eclipse或Maven无关。

答案 1 :(得分:1)

我怀疑您正在使用JUnit 3.尝试将测试重命名为不以“test”开头的内容。如果测试不再执行,则使用JUnit 3(假设测试方法是以“test”开头的方法)。

请发布您的Eclipse启动配置。

答案 2 :(得分:1)

我有类似的问题,我通过指定surefile和junit版本explisitly修复它:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.8.1</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.8.1</version>
        </dependency>
    </dependencies>
    <configuration>
        <parallel>methods</parallel>
        <threadCount>10</threadCount>
        <excludes>
            <exclude>**/*IntegrationTest.java</exclude>
        </excludes>
    </configuration>
</plugin>

更多信息在这里:http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html

似乎junit 3.8.1版本通过maven-resources-plugin和plexus-container-default暂时使用。您可以通过调用 mvn dependency:tree 来打印依赖关系树。我认为没有其他方法可以确保使用junit 4。