AndroidJUnit4.class + org.junit.Assume.assumeTrue = AssumptionViolatedException

AndroidJUnit4.class + org.junit.Assume.assumeTrue = AssumptionViolatedException

我已经设法将我的 Android 项目转移到 JUnit4,当然,我想这样做的主要原因是无法正常工作。如果有人在这里有想法,会喜欢任何帮助。

我要解决的问题是,如果构建未指向登台服务器,我想自动跳过某些测试。我已经用 BUILD_TYPE 设置了这个,它使用 gradle 注入基础 URL.

我在我的设置中设置了一个 assumeThat 子句,它可以正确识别构建何时未暂存,但它不会停止并忽略测试的其余部分,而是抛出异常并失败。

这是我的现场 API 测试的基础 class - 我用 @RunWith(AndroidJUnit4.class) 注释了从这里开始的下降,所以理论上这应该总是 运行 JUnit4 运行ner:

package com.[my package].nonuitests.liveservertests;

import android.support.test.runner.AndroidJUnit4;
import com.[my package].nonuitests.BaseAndroidTest;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * Tests against the live API. All tests descending from this class will
 * be ignored if the BUILD_TYPE is not staging.
 */
@RunWith(AndroidJUnit4.class)
public class BaseLiveServerTests extends BaseAndroidTest {

    private static final String STAGE = "staging";

    /******************
     * SETUP/TEARDOWN *
     ******************/

    @Override
    public void setUp() throws Exception {
        super.setUp();

        //TODO: Y U NO WORK?!
        //This should cause the rest of the test to be skipped if it fails,
        //but is instead throwing an AssumptionViolatedException. 
        assumeTrue(STAGE.equals(BuildConfig.BUILD_TYPE));
    }
}

那么,我的问题是:

  1. 有更好的方法吗?从理论上讲,这可以通过 flavor 来完成,但我早些时候尝试过,它让其他一切变得 way 更加复杂。
  2. 我的研究表明有一些东西 Google 没有在他们的 运行 中实现,这导致它爆炸了,但我很难弄清楚我 can/should 做了什么来解决这个问题。有什么建议我应该 subclass 让它按预期工作吗?

任何其他想法将不胜感激。谢谢!

编辑 (1/26/15 11:40am CST):根据 , I took a stab 将其实现为 @Rule,但目前它仍然无法正常工作.这似乎是一条很有前途的道路,但目前行不通。

编辑 2(1/26/15 12:15pm CST):好的,

https://github.com/junit-team/junit/wiki/Assumptions-with-assume

ad 2) 自定义运行程序可能会以不同方式处理 assume 语句。要修复它,您应该编写自己的 Android 运行器版本,并实现一种处理假设的方法,就像本机 JUnit 运行器所做的那样,或者为 android 测试运行器制造一个错误。

广告 1) 我建议:尝试使用 JUnit 规则:

http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/ http://cwd.dhemery.com/2010/12/junit-rules/

好的,最终它与 @Rules 一起工作 , although with significant changes since MethodRule has been deprecated. Here's a gist 结果是什么 - 我会在完善它时尽量保持更新。

一些重要说明:

  1. 您必须在测试 class 中实例化您的 @Rule,否则您将永远不会真正命中任何检查。
  2. 截至目前,这将 不会 将 Android 上的测试标记为忽略,它只会通过它而不会实际测试任何东西。

在 Junit 4.12 中它无法处理 tearDown

如果你有 tearDown,你必须添加一个带有你的条件的 if 语句,而不是 assumeTrue。我认为 Junit 的所有者说它不应该与 @After

一起工作
@After
    override fun tearDown() {
        if (junit == worksAgain()) {