Android单元测试需要上下文

Mac*_*bey 59 database android unit-testing

我正在编写我的第一个Android数据库后端,我正在努力对我的数据库的创建进行单元测试.

目前我遇到的问题是获取一个有效的Context对象来传递给我的SQLiteOpenHelper实现.有没有办法在扩展TestCase的类中获取Context对象?我想到的解决方案是在我的TestCase的setup方法中实例化一个Activity,然后将该Activity的Context分配给我的测试方法可以访问的字段变量......但似乎应该有一个更简单的方法.

感谢您的输入!

梅西

Eri*_*ass 41

您可以尝试切换到AndroidTestCase.通过查看文档,似乎它应该能够为您提供有效的Context以传递给SQLiteOpenHelper.

编辑:请记住,您可能必须在Eclipse中的"Android测试项目"中设置测试,因为测试将尝试在模拟器(或真实设备)上执行.

  • AndroidTestCase现已弃用,建议使用InstrumentationRegistry. (3认同)
  • `android.support.test.InstrumentationRegistry` 现在也已折旧。谷歌贬值东西的速度比你输入 stackoverfow 评论的速度还要快。 (3认同)

bir*_*rdy 28

如果您正在运行测试InstrumentationRegistry,则可以使用InstrumentationRegistry.getTargetContext()方法来获取上下文:

Context- 提供InstrumentationRegistry.getContext()目标应用程序的应用程序.

Context- 提供InstrumentationRegistry.getInstrumentation().getTargetContext()本仪器的包装.


对于AndroidX使用InstrumentationRegistry.getInstrumentation().getContext()InstrumentationRegistry.

  • 需要一个更完整的例子. (5认同)
  • 这不是单元测试,而是集成测试。 (4认同)
  • AndroidJUnit4.class 来自什么依赖项? (2认同)
  • 更新:使用“ApplicationProvider.getApplicationContext()”代替 (2认同)

Ehs*_*san 15

你的测试不是单元测试!!!

当你需要

  • 语境
  • 读取或写入存储
  • 接入网
  • 或更改任何配置以测试您的功能

您不是在编写单元测试。

您需要在androidTest包中编写测试

  • 您的意思是这不是*本地*测试(而是*仪器化*测试)。“androidTest”包中的测试很可能是单元测试。 (7认同)

Tim*_*ist 5

根据AndroidTestCase:getContext()我的经验,使用该方法只会提供存根上下文。为了测试,我在主应用程序中使用了一个空活动,并Context通过该活动获取了。我还用ActivityInstrumentationTestCase2该类扩展了测试套件类。似乎为我工作。

public class DatabaseTest extends ActivityInstrumentationTestCase2<EmptyActivity>
    EmptyActivity activity;
    Context mContext = null;
    ...
    @Before
    public void setUp() {
        activity = getActivity();
        mContext = activity;
    }
    ... //tests to follow
}
Run Code Online (Sandbox Code Playgroud)

其他人都在做什么?


Wer*_*ght 5

您可以从MockContext派生并返回例如MockResources on getResources()、有效ContentResolver ongetContentResolver()等。这会带来一些痛苦,一些单元测试

替代方法是运行例如模拟整个 Android 操作系统的Robolectric。这些将用于系统测试:运行速度要慢得多。