【问题标题】:Eclipse junit test discoveryEclipse junit 测试发现
【发布时间】:2013-06-03 05:18:17
【问题描述】:

在 eclipse 中 - junit 测试运行器会找到这个测试:

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

但它不会找到这个测试

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

谁能解释原因,是否有可能以某种方式解决这个问题?

【问题讨论】:

  • 日食如何计算出 T 的值
  • 它是一个静态子类 - 与 T 无关...Java 不会将模板变量推送到任何静态元素
  • 在这个问题中似乎有 C# 和 Java 的混合......

标签: java eclipse junit


【解决方案1】:

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

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

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-test 正常运行,它将运行您在 SuiteClasses 注释中指定的所有测试类。

【讨论】:

  • 谢谢 - 但我们实际上使用外部运行器运行 CI 下的完整测试 - 我真正要寻找的是文档大纲中的“使用 junit 运行”......否则它是好主意
【解决方案2】:

这有点奇怪。 Eclipse 好像和这个有点不一致。

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

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

public class GenericTest<T> {
  @Test public void foobar() {
    System.out.println("GenericTest");
  }
}

那么“运行方式->JUnit 测试”选项在此类上不可用。如果您删除 ,它将变为可用并且您可以运行它;它出现在 JUnit 视图中。就像你说的那样。

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

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

有关信息,JUnit 视图并不能真正阻止您这样做,因为它将类名存储在运行配置中:请参阅How does Eclipse actually run Junit tests?。

如果您提出问题,我认为您不会走得太远,因为正如我所说,以这种方式使用泛型类并没有真正意义。

【讨论】:

  • 以您提到的方式使用泛型类是没有意义的 - 但以我每天提到的方式使用它。我们都在关注开发速度/最不意外的原则 - 我们维护 X 类测试的最简单/最快的方法是在测试类 inside X 中。如果 X 不是通用的,那么这很有效.如果 x 是通用的,则不是。测试类本身总是一个非泛型静态类,所以我不明白为什么 eclipse 会关心
  • 就像我说的,这是不允许泛型类通过的发现机制。如果您想提出问题,请继续,但请注意错误修复可能需要一段时间...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 2022-01-02
  • 2023-03-08
  • 2011-08-08
  • 2010-10-31
  • 2012-02-05
  • 1970-01-01
相关资源
最近更新 更多