如何编写一个在@Category中的TestCase之前运行@BeforeCategory方法的JUnit运行器?

时间:2014-05-26 13:12:59

标签: java junit junit-runner

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

要求如下:

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

话虽如此,我看了不同的选择。

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

所以我查看了ClasspathSuite Runner,它允许在每个套件中放置类路径中的所有类,并在使用@Category后过滤它们

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

=>一切都近乎完美。

  • 启动单个测试时,将启动此测试的@BeforeClass
  • 启动Test Suite时,会启动正确的Tests(感谢@Category),@BeforeSuite只会被调用一次,但是@BeforeClass每次测试都会调用,不应该调用。

=>所有这些事情促使我考虑实施自己的Runner。 我尝试扩展ClasspathSuite Runner,但它不是为此而设计的。 我尝试扩展套件Runner,但我没有成功。

您能帮助我了解如何在JUnit Runner中实现这些要求吗?

1 个答案:

答案 0 :(得分:1)

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

    如果@Category的分类前方法已经运行,则
  • 不执行任何操作,或
  • 运行前类别方法,并在列表中注明已运行@Category方法。

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