1

我正在尝试编写一个特定的 JUnit Runner,但我没有在网上找到好的教程/示例。

要求如下:

  • 我将进行一些分类测试(例如,catA 类别中的 A.java,catA 类别中的 B.java,catC 类别中的 C.java
  • 如果单独启动测试,每个测试都有一个@BeforeClass需要运行的方法
  • 启动同一类别的所有测试时,该@BeforeClass方法只能启动一次。
  • Junit 测试中的每个 @Test 方法也有@Before@After方法。

话虽如此,我查看了可用的不同选项。

我首先Test Suites使用提供的 junit Suite Runner 创建代表我的测试类别的类别。( @RunWith(Suite.class)) 您需要Tests在套件中手动提供,使用起来@SuiteClasses()很烦人。

所以我查看了ClasspathSuiteRunner,它允许将类路径中的所有类放在每个套件中,并在之后过滤它们@Category

它还提供了一个@BeforeSuite注解,该注解在套件启动时启动一次。

=> 一切都近乎完美。

  • 启动单个测试时,将启动@BeforeClassfrom this test
  • 当 aTest Suite被启动时,正确Tests的被启动(感谢@Category),@BeforeSuite只被调用一次,但是@BeforeClass每个 Test 的 也被调用,它不应该被调用。

=> 所有这些都让我开始考虑实现我自己的 Runner。我尝试扩展 ClasspathSuite Runner,但它不是为此而设计的。我尝试扩展库存的 Suite Runner,但没有成功。

你能帮我理解如何在 JUnit Runner 中实现这些要求吗?

4

1 回答 1

1

不写跑步者怎么办?相反,编写一个@BeforeClass使用单例列表的方法,该列表记录已在当前测试运行中运行的每个前分类方法,并且知道如何运行所有前分类方法(每个可能在其自己的类中)。该@BeforeClass方法确定其类的@Category,检查列表,并

  • 如果 that@Category的 before-category 方法已经运行,则什么也不做,或者
  • 运行 before-category 方法并在列表中注明该@Category方法已运行。

不需要自定义运行器会更好,因为它可以在提供自己的运行器的环境中工作,例如 IDE 和持续集成服务器。

于 2014-05-26T14:02:59.143 回答