Java Eclipse junit测试发现

Java Eclipse junit测试发现,java,eclipse,junit,Java,Eclipse,Junit,在eclipse中,junit测试运行程序将发现以下测试: class Blah { public static class Tests { [Test] void testOne() {} }} 但是它找不到这个测试 class Blah<T> { public static class Tests { [Test] void testOne() {} }} class废话{ 公共静态类测试{ [Test]void testO

在eclipse中,junit测试运行程序将发现以下测试:

class Blah { 
    public static class Tests {
        [Test] void testOne() {}
}}
但是它找不到这个测试

class Blah<T> { 
    public static class Tests {
        [Test] void testOne() {}
}}
class废话{
公共静态类测试{
[Test]void testOne(){}
}}

有人能解释一下原因吗?有没有可能以某种方式解决这个问题?

我无法解释为什么eclipse不接受泛型类作为JUnit测试运行。这可能是一个bug,但我在问题追踪器上找不到任何东西

现在有两种解决问题的方法。您可以手动为测试创建运行配置并启动此操作。另一种方法是使用测试套件。向测试包中添加一个新类,该类包含以下内容

package com.prodyna.packetcapture.text;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ Blah.class })
public class AllTests {

}

您可以将其作为JUnit测试正常运行,它将运行您在
SuiteClasses
注释中指定的所有测试类。

这有点奇怪。Eclipse似乎与此有点不一致

首先,我们需要说,像这样的通用测试是没有意义的。JUnit(和Eclipse)使用反射实例化这个类,因此它不关心泛型部分。它可能不会像你期望的那样工作

为了解释Eclipse部分,Eclipse有两个执行JUnit测试的阶段:它检测类是否是JUnit测试,然后执行它。这是阻止您运行测试的第一部分。如果创建通用测试:

public class GenericTest<T> {
  @Test public void foobar() {
    System.out.println("GenericTest");
  }
}
公共类泛型测试{
@测试公共void foobar(){
System.out.println(“GenericTest”);
}
}
那么“运行方式->JUnit测试”选项在此类上不可用。如果删除,它将变为可用,您可以运行它;它出现在JUnit视图中。正如你所说

不一致的部分是,当您放回测试时,现在可以从JUnit视图重新执行测试

因此,当类为泛型时,测试的执行实际上是有效的。但是,您不能在Eclipse中正常执行它

关于信息,JUnit视图并不能真正阻止您这样做,因为它将类名存储在运行配置中:请参阅


我认为如果你提出一个问题,你不会走得太远,因为正如我所说的那样,以这种方式使用泛型类是没有意义的。

eclipse将如何计算出Tit的静态子类的值-到t是不相关的。。。Java没有将模板变量推送到任何静态元素在这个问题上似乎是C#和Java的混合体……以你提到的方式使用泛型类没有意义——但以我每天提到的方式使用它。我们都是关于开发速度/最小惊喜原则的-对于我们来说,维护类X测试的最简单/最快的方法是在X内部的测试类中。如果X不是泛型的,那么它工作得很好。如果x是泛型的,则不是。测试类本身总是一个非泛型静态类,所以我不明白为什么eclipse会像我所说的那样,是发现机制不允许泛型类通过。如果您想提出一个问题,请继续,但请注意错误修复可能需要一段时间…谢谢-但实际上我们使用外部运行程序运行CI下的完整测试-我真正想要的是文档大纲中的“使用junit运行”。。。否则这是个好主意