问题 JUnit测试继承不起作用


public abstract class GenericTests<T extends Number> {
  protected abstract T getT();      

  @Test public void test1() {
    getT();
  }
}

public class ConcreteTests1 extends GenericTests<Integer> { ... }
public class ConcreteTests2 extends GenericTests<Double> { ... }

根本不执行任何测试,忽略这两个具体类。我如何使其工作? (我预计 test1() 要为两者执行 Integer 和 Double)。

我使用JUnit 4.8.1。

更新:似乎问题与maven-surefire-plugin有关,而不是JUnit本身。请参阅下面的答案。


8117
2018-01-10 19:18


起源

你需要扩展TestCase吗? - Paul Medcraft
Junit4不要求你扩展TestCase但是你如何运行它们?从命令行?来自Eclipse? - jeff
你能包含其中一个子类的内容吗? - rogermushroom
什么是B?当然它应该是Number,除非你将具有2个具有相同名称的类(Double和Integer)的类分类为核心库中的类? - rogermushroom
我想你的代表你已经接触过这个网站所需的迂腐程度,显然不是。 - rogermushroom


答案:


将我的所有类重命名为后缀“Test”,现在它可以工作(Concrete1TestConcrete2Test)。

更新

这与maven-surefire-plugin的默认设置有关。

http://maven.apache.org/plugins/maven-surefire-plugin/examples/inclusion-exclusion.html

默认情况下,Surefire插件将自动包含具有以下通配符模式的所有测试类:

**/Test*.java  - 包括其所有子目录和所有以“Test”开头的java文件名。    **/*Test.java  - 包括其所有子目录和以“Test”结尾的所有java文件名。    **/*TestCase.java  - 包括其所有子目录和所有以“TestCase”结尾的java文件名。


13
2018-01-10 19:44



这是因为surefire-plugin maven用于运行测试“发现”基于类名的测试。他们必须匹配一些可接受的模式之一,BlahTest就是其中之一。以下是有关默认设置以及如何在配置中自定义它们的更多信息... maven.apache.org/plugins/maven-surefire-plugin/examples/... - Jesse Webb
是的,这是有道理的。 surefire插件使用的默认文件名(在您调用时执行的maven插件) mvn test) 是 **/Test*.java, **/*Test.java 和 **/*TestCase.java。参考: maven.apache.org/plugins/maven-surefire-plugin/... - matsev


我在Eclipse中使用你的骨架代码对它进行了测试,它运行良好:

基类:

package stkoverflow;

import org.junit.Test;

public abstract class GenericTests<T> {
    protected abstract T getT();

    @Test
    public void test1() {
        getT();
    }    
}

子类:

package stkoverflow;

public class ConcreteTests1 extends GenericTests<Integer> {

    @Override
    protected Integer getT() {
        return null;
    }    
}

在Eclipse中运行ConcreteTests1 Junit Runner运行良好。也许问题出在Maven身上?


0
2018-01-10 19:47