今天初次使用ormlite包编写数据库项目,中间遇到教程中的一个问题,即编写测试类测试增删改查函数时
有一行代码DatabaseHelper helper = DatabaseHelper.getHelper(getContext()); 该代码在eclipse下能完整运行
可在android studio 下会出现一个问题 所getContext 为null。导致无法打开数据库文件。
网上解决方法有:
1 new MockContext();
2 getInstrument().getContext();
3Context appContext = InstrumentationRegistry.getTargetContext();
均不能解决问题最终context 仍为null;
解决思路是:
开始以为是路径权限有问题。
后来查出是:使用Android JUnit Test方式测试A工程。而A工程和Test工程 是两个独立的工程。
造成A工程建立了数据库,在Test工程中访问受限。
最终 解决办法是:
好了!我要开始变身了!下面我们要向testing的世界say hello了!
我在package-name/module/main包下面有一个MainActivity,作为答疑君的启动页。在这个启动页上会显示一段文字,我希望通过自动化测试来确认这个文字确实显示在了屏幕上。
于是,我应该在androidTest/package-name/module/main下面创建一个AppStartActivityTest类,键入如下代码:
package im.dayi.app.student.module.main;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.TextView;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Test for AppStartActivity
* Created by Anchorer on 2016/1/13.
*/
@RunWith(AndroidJUnit4.class)
public class AppStartActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private MainActivity mActivity;//定义一个mainactivity类
public AppStartActivityTest() {
// 所有的ActivityInstrumentationTestCase2子类都需要调用该父类的super(String)构造方法
super(MainActivity.class);
}
@Before
public void setUp() throws Exception {
super.setUp();
// @Before注解表示在执行所有的testCase之前要做的事情
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
// getActivity()方法会在开始所有的testCase之前启动相应的Activity
mActivity = getActivity();
// 获取MainActivity 的context
DatabaseHelper helper = DatabaseHelper.getHelper(mActivity);
}
@Test
public void testPreconditions() {
// @Test注解表示一个测试用例方法
assertNotNull("AppStartActivity is null", mActivity);
}
}
其实质就是将MainActivity 作为参数传进Test类
这样在类中调用DatabaseHelper helper = DatabaseHelper.getHelper(MainActivity);
即可将Test工程访问Main工程。
最终实现访问ormlite 数据库默认地址//data/data/com.exampel.ormlitedemo/databases/sqlite_test.db(我的地址)