Eclipse JUnit测试发现

3
在Eclipse中,JUnit测试运行程序将找到这个测试:
class Blah { 
    public static class Tests {
        [Test] void testOne() {}
}}

但是它找不到这个测试

class Blah<T> { 
    public static class Tests {
        [Test] void testOne() {}
}}

有人能解释一下为什么会出现这种情况吗?是否有可能以某种方式修复它?


2
Eclipse将如何确定T的值? - Jayan
这是一个静态子类 - 对于 T 来说并不重要... Java 不会将模板变量传递到任何静态元素中。 - Darren Oakey
1
这个问题似乎混淆了C#和Java的语言特性。 - Matthew Farwell
2个回答

2

我无法解释为什么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注释中指定的所有测试类。


谢谢 - 但我们实际上在CI下运行完整测试时已经使用了外部运行器 - 我真正需要的是来自文档大纲的“使用junit运行”...否则这是一个好主意。 - Darren Oakey

2
这有点奇怪。Eclipse在这方面似乎有点不一致。
首先,我们需要说的是,像这样的通用测试并没有什么意义。JUnit(以及Eclipse)使用反射实例化此类,因此它不关心泛型部分。它可能不会按您的预期工作。
为了解释Eclipse部分,Eclipse执行JUnit测试有两个阶段:检测类是否为JUnit测试,然后执行它。正是第一部分阻止您运行测试。如果创建通用测试:
public class GenericTest<T> {
  @Test public void foobar() {
    System.out.println("GenericTest");
  }
}

那么在这个类上选项'Run as->JUnit test'不可用。如果您删除,它就会变得可用,并且您可以运行它;它会出现在JUnit视图中。这正如您所说的。
不一致的部分是当您把放回时,您现在可以从JUnit视图中重新执行测试。

Eclipse rerun JUnit test

执行测试时,如果类是通用的,则实际上可以正常工作。然而,在Eclipse中无法正常执行它。
需要注意的是,JUnit视图无法真正阻止你这样做,因为它将类名存储在运行配置中:请参见 Eclipse如何实际运行Junit测试?
我认为如果提出问题,你不会有太大的进展,因为如我所说,在此方式下使用通用类并不真正有意义。

按照你提到的方式使用通用类没有意义 - 但是按照我提到的方式,我每天都在使用它。我们关注的是开发速度/最小惊讶原则 - 对于我们维护X类测试的最简单/最快的方法是在X内部创建一个测试类。如果X不是通用的,那么这个方法完美地奏效。如果X是通用的,那么就不行了。测试类本身始终是一个非通用的静态类,所以我看不出为什么Eclipse会介意。 - Darren Oakey
就像我说的那样,是发现机制不允许通用类通过。如果您想提出问题,请继续,但请注意修复错误可能需要一段时间... - Matthew Farwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接