Android JUnit4 测试 - 从哪里获取上下文?

Android JUnit4 Testing - Where to get Context from?

我必须构建一个使用 sqlite 的应用程序。现在我想写我的单元测试。这些单元测试应该测试我的 class SQLiteBridgeSQLiteBridge 为模型的每个子 class 提供 DAO。

现在我遇到了问题,我需要一个上下文来创建我的 SQLiteBridgeSQLiteBridge 在系统上创建并处理 SQLite 数据库..

从哪里获取上下文对象?

我的设置如下(所以我使用的是 Junit4 [感谢上帝]): http://tools.android.com/tech-docs/unit-testing-support

编辑:我希望有一种方法可以像旧的 AndroidTestCase 一样在不丢失 Junit4 的情况下进行扩展。 :)

如此处所述:https://code.google.com/p/android-test-kit/wiki/AndroidJUnitRunnerUserGuide 使用 InstrumentationRegistry 获取上下文。

但是,如果您直接调用 InstrumentationRegistry.getContext(),您可能会在打开数据库时遇到异常。我相信这是因为 getContext() 返回的上下文指向仪器的上下文,而不是您的应用程序/单元测试的上下文。而是使用 InstrumentationRegistry.getInstrumentation().getTargetContext()

例如:

@RunWith(AndroidJUnit4.class)
public class SqliteTest {

    Context mMockContext;

    @Before
    public void setUp() {
        mMockContext = new RenamingDelegatingContext(InstrumentationRegistry.getTargetContext(), "test_");
    }
}

RenamingDelegatingContext 只是在 file/database 名称前加上 test_ 前缀,以防止您覆盖同一模拟器中可能拥有的数据。

jUnit 4(可能还有其他版本的 jUnit)和 androidx 使用:

ApplicationProvider.getApplicationContext();

参见:Android Documentation