database - unit - salesforce单元测试




Android单元测试需要上下文 (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
}

其他人都做了什么?

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

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

感谢您的输入!

梅西


如果您使用AndroidJUnit4运行测试, AndroidJUnit4可以使用InstrumentationRegistry方法获取上下文:

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

InstrumentationRegistry.getContext() - 提供此Instrumentation包的Context


您可以尝试切换到AndroidTestCase 。 从查看文档看起来它应该能够为您提供一个有效的Context传递给SQLiteOpenHelper。

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


您应该使用ApplicationTestCase或ServiceTestCase。


替代解决方案是避免使用ApplicationTestCaseAndroidTestCase或依赖于Context任何其他类。 关键是没有必要测试SQLiteORM框架,因此您可以使用基本的CRUD方法创建接口:

public interface UsersManager{
  User createUser(String userId);
  User getUser(String userId);
  boolean updateUser(User user);
  boolean deleteUser(User user);
}

并实现两个版本:一个用于测试,另一个用于生产运行时。 使用HashMap可以轻松实现测试版本:

public class TestUsersManager implements UsersManager{

  private HashMap<String, User> users = new HashMap();

  public User createUser(String userId){
    User result = new User(userId);
    users.put(userId, user);
    return result;
  }
  //... other methods
}

它工作得很快(在SQLite情况下没有磁盘IO )并且没有外部依赖性。 顺便说一下,这也是额外的抽象级别:对于生产代码,您可以轻松地在ORM框架之间切换。


首先在(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;
}}




unit-testing