Android单元测试需要上下文


71

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

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

Answers:


41

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

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


扩展AndroidTestCase然后调用时this.getContext()null将返回。那是应该如何工作的?我期望将返回一个可以与SQLite一起使用的丰富Context
cdaringe'Mar 23''23

3
现在已弃用AndroidTestCase,建议改用InstrumentationRegistry。
Airsource Ltd

42

您可以使用InstrumentationRegistry方法来获取上下文:

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

InstrumentationRegistry.getContext()-提供Context此工具包的。


对于AndroidX,请使用InstrumentationRegistry.getInstrumentation().getTargetContext()InstrumentationRegistry.getInstrumentation().getContext()


1
AndroidJUnit4.class来自什么依赖关系?
Ewoks

5
同上需要一个更完整的例子。
StarWind0

1
这不是单元测试,而是集成测试。
达斯汀K

9

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

何时需要

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

您不是在编写单元测试。

您需要在androidTest程序包中编写测试


6

根据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
}

其他人都在做什么?


5

您可以从MockContext派生并返回例如MockResources on getResources(),有效的ContentResolver ongetContentResolver()等等。这让您有些痛苦,但可以进行一些单元测试

替代方法是运行例如Robolectric,它可以模拟整个Android OS。这些将用于系统测试:运行起来要慢得多。


3

您应该使用ApplicationTestCase或ServiceTestCase。


2

扩展AndroidTestCase并调用AndroidTestCase:getContext()对于我来说可以很好地获取Context并将其与SQLiteDatabase一起使用。

唯一的麻烦是它创建和/或使用的数据库将与生产应用程序使用的数据库相同,因此您可能希望对这两个数据库使用不同的文件名

例如。

  public static final String    NOTES_DB      = "notestore.db";
  public  static final String   DEBUG_NOTES_DB = "DEBUG_notestore.db";

0

首先在(androidTest)下创建测试类。

现在使用以下代码:

public class YourDBTest extends InstrumentationTestCase {

private DBContracts.DatabaseHelper db;
private RenamingDelegatingContext context;

@Override
public void setUp() throws Exception {
    super.setUp();
    context = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), "test_");
    db = new DBContracts.DatabaseHelper(context);
}

@Override
public void tearDown() throws Exception {
    db.close();
    super.tearDown();
}

@Test
public void test1() throws Exception {
    // here is your context
    context = context;
}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.