有条件地忽略JUnit 4中的testing

好的,所以@Ignore注释对于标记不应该运行testing用例是很好的。

但是,有时我想忽略基于运行时信息的testing。 一个例子可能是如果我有一个并发testing,需要在一定数量的核心的机器上运行。 如果这个testing是在一个单处理器机器上运行的,我认为只是通过testing是不正确的(因为它还没有运行),而且肯定不能通过testing并破坏构build。

所以我希望能够在运行时忽略testing,因为这似乎是正确的结果(因为testing框架将允许构build通过,但loggingtesting不运行)。 我相当肯定注释不会给我这种灵活性,并且怀疑我需要手动为有问题的类创buildtesting套件。 然而,文档并没有提到任何有关这一点,通过API来看,它也不清楚如何以编程方式(即我如何编程创build一个Test或类似的实例相当于@Ignore注释创build的实例?)。

如果有人在过去做过类似的事情,或者对我能做些什么还有一个很好的想法,我很乐意听到这个消息。

JUnit的方法是在运行时这样做是org.junit.Assume

  @Before public void beforeMethod() { org.junit.Assume.assumeTrue(someCondition()); // rest of setup. } 

您可以在@Before方法中或在testing本身中执行,但不能在@After方法中执行。 如果你在testing中自己做,你的@Before方法将会运行。

假设失败导致testing被忽略。

编辑:为了与来自junit-ext@RunIf注释进行比较,他们的示例代码如下所示:

 @Test public void calculateTotalSalary() { assumeThat(Database.connect(), is(notNull())); //test code below. } 

更不用说,以这种方式从Database.connect()方法捕获和使用连接要容易得多。

您应该签出Junit-ext项目。 他们有RunIf注释执行条件testing,如:

 @Test @RunIf(DatabaseIsConnected.class) public void calculateTotalSalary() { //your code there } class DatabaseIsConnected implements Checker { public boolean satisify() { return Database.connect() != null; } } 

[代码示例取自他们的教程]

在JUnit 4中,另一个选项可能是创build一个注释来表示testing需要满足您的自定义条件,然后使用自己的扩展默认运行器并使用reflection,将您的决定基于自定义条件。 它可能看起来像这样:

 public class CustomRunner extends BlockJUnit4ClassRunner { public CTRunner(Class<?> klass) throws initializationError { super(klass); } @Override protected boolean isIgnored(FrameworkMethod child) { if(shouldIgnore()) { return true; } return super.isIgnored(child); } private boolean shouldIgnore(class) { /* some custom criteria */ } } 

快速注意: Assume.assumeTrue(condition)忽略其余的步骤,但通过testing。 要使testing失败,请在条件语句中使用org.junit.Assert.fail() 。 像Assume.assumeTrue()一样工作, Assume.assumeTrue()通过testing。