忽略Android单元测试,具体取决于SDK级别

时间:2013-07-15 12:27:50

标签: android junit

是否有注释或其他一些方便的方法来忽略特定Android SDK版本的junit测试?是否有类似于Lint注释TargetApi(x)的东西?或者我是否需要手动检查是否使用Build.VERSION运行测试?

3 个答案:

答案 0 :(得分:9)

我认为没有准备好的东西,但为此创建自定义注释非常容易。

创建自定义注释

@Target( ElementType.METHOD )
@Retention( RetentionPolicy.RUNTIME)
public @interface TargetApi {
    int value();
}

Ovverride测试运行器(将检查值并最终忽略/触发测试)

public class ConditionalTestRunner extends BlockJUnit4ClassRunner {
    public ConditionalTestRunner(Class klass) throws InitializationError {
        super(klass);
    }

    @Override
    public void runChild(FrameworkMethod method, RunNotifier notifier) {
        TargetApi condition = method.getAnnotation(TargetApi.class);
        if(condition.value() > 10) {
            notifier.fireTestIgnored(describeChild(method));
        } else {
            super.runChild(method, notifier);
        }
    }
}

并标记您的测试

@RunWith(ConditionalTestRunner.class)
public class TestClass {

    @Test
    @TargetApi(6)
    public void testMethodThatRunsConditionally() {
        System.out.print("Test me!");
    }
}

刚刚测试过,它对我有用。 :)

致记:Conditionally ignoring JUnit tests

答案 1 :(得分:2)

我一直在寻找这个问题的答案,并没有找到比检查版本更好的方法。通过检查以下Android TestCase方法,我能够有条件地抑制测试逻辑的执行。但是,这实际上并不妨碍单个测试的执行。覆盖这样的runTest()方法将导致测试在您知道不起作用的API级别上“通过”。根据您的测试逻辑,您可能还想覆盖tearDown()。也许有人会提供更好的解决方案。

@Override
protected void setUp() throws Exception {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
        if (Log.isLoggable(TAG, Log.INFO)) {
            Log.i(TAG, "This feature is only supported on Android 2.3 and above");
        }
    } else {
        super.setUp();
    }
}

@Override
protected void runTest() throws Throwable {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
        assertTrue(true);
    } else {
        super.runTest();
    }
}

答案 2 :(得分:0)

一种替代方法是使用JUnit的assume功能:

@Test
fun shouldWorkOnNewerDevices() {
   assumeTrue(
       "Can only run on API Level 23 or newer because of reasons",
       Build.VERSION.SDK_INT >= 23
   )
}

如果应用,则可以有效地将测试方法标记为已跳过。

这不像注释解决方案那么好,但是您也不需要自定义的JUnit测试运行器。