API级别28的Android-ProviderTestCase2无法正常运行

时间:2018-10-01 19:00:03

标签: java android integration-testing android-contentprovider

前一段时间,我使用ProviderTestCase2创建了一些测试化的测试。现在,我想更新代码库,并尝试在当前环境中重新激活旧的测试。

1)当我更新到compileSdkVersion 28时,似乎不再有任何类ProviderTestCase2。清理和构建项目失败。 如果我回到版本27,则可以成功构建该项目。

2)我有一个特例,我想用一组测试来测试对象的不同变体。因此,我决定利用继承并将测试放在基类中,配置要由超类测试的对象。这过去曾经奏效。 (是的,我知道测试中的继承是不好的观点,但是在这种情况下就可以了;-))

现在不执行任何测试。 Android Studio抱怨说有一个空的测试套件。

还有警告,我在扩展JUnit3的类中使用JUnit4注释进行了测试。我不记得我曾经看过这些警告。

这是Android库中的错误吗?还是在哪里可以找到解决该问题的提示?

(使用Android Studio 3.2和最新的库)

3 个答案:

答案 0 :(得分:6)

ProviderTestCase2战争已移除。应该使用ProviderTestRule(来自支持测试库或AndroidX)。

请参阅:

添加com.android.support.test:rules依赖性,以便能够使用规则。

以下是参考页中的示例:

@Rule
public ProviderTestRule mProviderRule =
    new ProviderTestRule.Builder(MyContentProvider.class, MyContentProvider.AUTHORITY).build();

@Test
public void verifyContentProviderContractWorks() {
    ContentResolver resolver = mProviderRule.getResolver();
    // perform some database (or other) operations
    Uri uri = resolver.insert(testUrl, testContentValues);
    // perform some assertions on the resulting URI
    assertNotNull(uri);
}

答案 1 :(得分:1)

接受的答案不正确。 ProviderTestRule处于Beta版,因此不会弃用或删除ProviderTestCase2。发生的事情是,该文件已移至您需要在build.gradle中声明的库中:

useLibrary 'android.test.base'

请参阅:https://developer.android.com/training/testing/set-up-project

答案 2 :(得分:0)

TLDR

build.gradle

android {    
  useLibrary 'android.test.base' // for AndroidTestCase
  useLibrary 'android.test.runner' // for ProviderTestCase2
  useLibrary 'android.test.mock' // for MockContentProvider
}

有关各种基于JUnit的库的Android文档,可通过useLibrary调用:https://developer.android.com/training/testing/set-up-project#junit-based-libs

进一步的说明

mtotschnig's answer处在正确的轨道上,但还不完整。

首先,要导入ProviderTestCase2,您需要

build.gradle

android {
  useLibrary 'android.test.runner'
}

但是,ProviderTestCase2扩展了AndroidTestCase,因此您需要:

build.gradle

android {
  useLibrary 'android.test.base'
}

最后,如果要扩展ProviderTestCase2,则需要提供扩展ContentProvider的类型,并且可能需要扩展MockContentProvider来创建它。对于MockContentProvider,您需要(thanks to Sienna's related answer):

build.gradle

android {
  useLibrary 'android.test.mock'
}