Android jUnit TestCase:活动onCreate()实际上何时被调用?
我是相当新的测试,并试图探索jUnit测试和Robotium
。我的应用程序有4个屏幕。Android jUnit TestCase:活动onCreate()实际上何时被调用?
Splash Screen --> Screen2--> Screen 3--> Autocomplete Screen.
[init()] [ check values generated by init() method]
自动完成屏幕是用户输入内容的地方,应用程序会从产品的大型数据库执行自动完成。在启动画面中,我正在使用另一个类中的init()
方法初始化许多应用程序变量。这个init()
方法将加载usedr首选项,检查数据库的创建等...(产品数据库预先打包在apk中,我在第一次启动时复制数据库并将其标记为SharedPreferences
,如copied = true)。
问题:我如何隔离自动完成屏幕的测试? AutocompleteActivity的onCreate依赖于SplashScreen中调用的init()。我不确定何时jUnit创建了Activity
的实例,(可能在构造函数中?)。这里是我的TestCaseCode:
import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
import com.supervalu.mobile.android.AutoCompleteActivity;
import com.supervalu.mobile.android.db.LocalDb;
public class AutocompleteTest extends
ActivityInstrumentationTestCase2<AutoCompleteActivity> {
private Solo solo;
public AutocompleteTest() {
super("com.****.*****.*****", AutoCompleteActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
LocalDb.init(getActivity().getApplicationContext());
solo = new Solo(getInstrumentation(), getActivity());
}
public void test1Character() {
solo.sleep(2000);
solo.enterText(0, "c");
solo.sleep(10000);
View v = getActivity().findViewById(
com.*****.****.*****.R.id.list);
solo.waitForView(v);
assertTrue(((ListView) v).getChildCount() > 0);
}
public void test3Character() {
LocalDb.init(getActivity().getApplicationContext());
solo.enterText(0, "che");
View v = getActivity().findViewById(
com.*****.****.*****.R.id.list);
solo.waitForView(v);
assertTrue(((ListView) v).getChildCount() > 0);
}
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
测试用例保持creashing,因为需要的onCreate从LocalDb
whcih必须由init()
方法initialiazed一些值。
我不能在构造函数中的超级调用之前添加init()函数。是否有任何解决此问题的方法,或者是否需要从启动屏幕启动测试用例?
问题2:如果我从启动屏幕开始测试,我必须先导航到autocmplete屏幕,然后才能对其执行任何测试。假设我也这样做了,那么对于每个测试:test1character()该类执行setUp(),然后测试然后tearDown(),然后重新启动test3characters()函数的整个序列。在实际测试输入之前,每次都重复导航到自动合并屏幕会非常痛苦。对此也有任何建议?
我不知道采取什么方法。有人能指导我吗?
我发现嘲笑框架是更好的替代方法来执行Android活动方法的独立方法测试 。目前,jMockit仅仅是能够有效地模拟endroid基类的框架。
您将能够放弃很多设置和拆卸代码。见测试案例:
我真的不明白你的问题,但我会尽力帮助。
为了执行活动开始(并调用到它的的onCreate回调)是具有:
getActivity();
的通常的地方它是在setUp()
方法(每个测试之前调用)。
正如你所说的每个测试setUp()
和tearDown()
方法被称为。
我认为测试应用程序导航的最佳方式是在一个简单的测试中,并创建所有意图,因为您需要启动所有要测试的活动。
我希望它有帮助。
如果您正在进行单元测试,您应该将您的测试类扩展到ActivityUnitTestCase以测试单个活动并使用将调用您的onCreate的startActivity方法。 ActivityInstrumentationTestCase2用于对活动进行功能测试。
看到来自Android的参考文档更多...
下测试启动活动,以同样的方式,就好像它是由Context.startActivity开始(),它提供所提供的参数。当您使用此方法启动活动时,它将通过tearDown()自动停止。
此方法将调用onCreate(),但如果您希望进一步练习Activity生命周期方法,则必须自己从测试用例中调用它们。
不要从你的setUp()方法调用。您必须从每种测试方法调用此方法。
我有一个类似的问题,并能够解决它。 在你的setUp()方法中,调用getActivity()是没有用的。它不会影响您的测试方法。 你必须使用:
getInstrumentation().getTargetContext()
例如使用
getInstrumentation().getTargetContext().getContentResolver()
,而不是
getActivity().getContentResolver()
希望这对你的作品!
Cheers Antonino