2011-11-22 33 views
3

我是相当新的测试,并试图探索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()函数的整个序列。在实际测试输入之前,每次都重复导航到自动合并屏幕会非常痛苦。对此也有任何建议?

我不知道采取什么方法。有人能指导我吗?

回答

0

我真的不明白你的问题,但我会尽力帮助。

为了执行活动开始(并调用到它的的onCreate回调)是具有:

getActivity(); 

的通常的地方它是在setUp()方法(每个测试之前调用)。

正如你所说的每个测试setUp()tearDown()方法被称为。

我认为测试应用程序导航的最佳方式是在一个简单的测试中,并创建所有意图,因为您需要启动所有要测试的活动。

我希望它有帮助。

0

如果您正在进行单元测试,您应该将您的测试类扩展到ActivityUnitTestCase以测试单个活动并使用将调用您的onCreate的startActivity方法。 ActivityInstrumentationTestCase2用于对活动进行功能测试。

看到来自Android的参考文档更多...

下测试启动活动,以同样的方式,就好像它是由Context.startActivity开始(),它提供所提供的参数。当您使用此方法启动活动时,它将通过tearDown()自动停止。

此方法将调用onCreate(),但如果您希望进一步练习Activity生命周期方法,则必须自己从测试用例中调用它们。

不要从你的setUp()方法调用。您必须从每种测试方法调用此方法。

3

我有一个类似的问题,并能够解决它。 在你的setUp()方法中,调用getActivity()是没有用的。它不会影响您的测试方法。 你必须使用:

getInstrumentation().getTargetContext() 

例如使用

getInstrumentation().getTargetContext().getContentResolver() 

,而不是

getActivity().getContentResolver() 

希望这对你的作品!

Cheers Antonino

相关问题