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

时间:2015-01-26 06:45:48

标签: java android junit junit4 android-testing

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

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

我在我的设置中设置了一个assumeThat子句,它正确识别构建何时不进行分段,但不是暂停和忽略其余的测试,而是抛出异常并失败。

这是我的实时API测试的基类 - 我使用@RunWith(AndroidJUnit4.class)注释了这一点,所以理论上应该始终使用JUnit4运行器:

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. 有更好的方法吗?从理论上讲,这可以通过各种口味来完成,但我之前尝试过这样做,而其他一切方式更复杂。
  2. 我的研究表明谷歌没有在他们的跑步者中实施某种导致爆炸的东西,但是我有一段时间弄清楚我能做什么/应该做些什么来解决这个问题。有什么建议我应该继承,以使其按预期工作?
  3. 任何其他想法都将非常感激。谢谢!

    编辑(2015年1月26日上午11:40 CST):根据Grzesuav's suggestion,我将a stab作为@Rule执行此操作,但此刻它仍然是{{1}}不工作这似乎是一条很有希望的道路,但目前还不起作用。

    编辑2(2015年1月26日下午12:15 CST):好的,now it's working

3 个答案:

答案 0 :(得分:2)

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

ad 2)自定义运行器可以不同地处理假定语句。要修复它,你应该编写自己的Android版本,并实现一种处理假设作为本机JUnit运行程序的方式,或者为android测试运行器制造一个bug。

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

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

答案 1 :(得分:2)

好的,最后得到它@RulesGrzesuav's suggestion,尽管自MethodRule被弃用以来发生了重大变化。这是原来的a gist - 我会尽力保持更新,因为我对它进行了改进。

一些重要的注释:

  1. 您必须在测试课程中实例化@Rule,否则您将永远不会点击任何支票。
  2. 截至目前,这将标记测试在Android上被忽略,它只是通过它而不实际测试任何东西。

答案 2 :(得分:0)

在Junit 4.12中,它无法处理撕毁

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

一起使用
@After
    override fun tearDown() {
        if (junit == worksAgain()) {