是否有注释或其他一些方便的方法来忽略特定Android SDK版本的junit测试?是否有类似于Lint注释TargetApi(x)的东西?或者我是否需要手动检查是否使用Build.VERSION运行测试?
答案 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!");
}
}
刚刚测试过,它对我有用。 :)
答案 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测试运行器。