代码之家  ›  专栏  ›  技术社区  ›  Macy Abbey

需要上下文的Android单元测试

  •  55
  • Macy Abbey  · 技术社区  · 16 年前

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

    当前我遇到的问题是获取有效的上下文对象以传递给我的sqliteOpenHelper实现。有没有方法在扩展测试用例的类中获取上下文对象?我想到的解决方案是在我的测试用例的设置方法中实例化一个活动,然后将该活动的上下文分配给一个我的测试方法可以访问的字段变量……但似乎有一种更简单的方法。

    谢谢你的意见!

    梅西

    8 回复  |  直到 16 年前
        1
  •  39
  •   Erich Douglass    16 年前

    您可以尝试切换到 AndroidTestCase . 从查看文档来看,它似乎应该能够为您提供一个有效的上下文来传递给sqliteOpenHelper。

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

        2
  •  23
  •   amukhachov    7 年前

    如果使用 AndroidJUnit4 ,你可以使用 InstrumentationRegistry 获取上下文的方法:

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

    InstrumentationRegistry.getContext() -提供 语境 此仪器的组件。


    供Androidx使用 InstrumentationRegistry.getInstrumentation().getTargetContext() InstrumentationRegistry.getInstrumentation().getContext() .

        3
  •  4
  •   Rostyslav Dzinko Ankit    13 年前

    使用 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
    }
    

    其他人都做什么?

        4
  •  2
  •   Neil    16 年前

    您应该使用applicationtestcase或servicetestcase。

        5
  •  2
  •   Wernight    11 年前

    你可以从 MockContext 并返回,例如a MockResources getResources() 一个有效的 ContentResolver getContentResolver() 等等,这会让一些人感到痛苦 单元测试 .

    另一种选择是运行,例如 Robolectric 模拟整个Android操作系统。那是为了 系统测试 :跑得慢很多。

        6
  •  1
  •   Ian    13 年前

    扩展androidtestcase并调用androidtestcase:getContext()对于我获取上下文并将其与sqliteDatabase一起使用非常有用。

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

    如。

      public static final String    NOTES_DB      = "notestore.db";
      public  static final String   DEBUG_NOTES_DB = "DEBUG_notestore.db";
    
        7
  •  0
  •   lidox    9 年前

    首先在(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;
    }}
    
        8
  •  -1
  •   eleven    10 年前

    另一种解决方案是避免使用 ApplicationTestCase AndroidTestCase 或任何其他依靠 Context . 关键是不需要测试 SQLite ORM 框架,以便您可以使用 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
    }
    

    它工作很快(没有磁盘 IO 万一 数据库 )而且没有外部依赖。顺便说一下,这也是额外的抽象级别:对于生产代码,您可以很容易地在 奥姆 例如,框架。