如何在Android InstrumentationTestCase中关闭或重新启动测试实例?

时间:2013-05-26 16:51:05

标签: android junit instrumentation android-testing

我通过运行从库项目“派生”的测试实现来运行我的Android测试(因为我有一个带有baselib和“具体应用程序项目”的多模块项目)。测试实现是这些具体的应用程序项目之一,由InstrumentationTestCase启动。在这个测试案例中,我通过RoboGuice模拟了图书馆项目中的几个部分。这意味着我使用模拟类(如持久性处理,数据库处理等)运行我的baselib的“真实”实现。为了能够做到这一点,每个测试用例都必须关闭并重新启动整个测试实例,因为我无法在设备上启动两次相同的应用程序。这些测试是比Junit测试更多的集成测试,因为我测试了某种工作流程,但没有其他可能性来测试,因为JUnit在Android测试中的可能性似乎非常有限。 目前我只能同时运行一个测试用例,因为如果我运行超过1,整个测试就会挂起。我已经检查过是否配置更改(请参阅私有方法)导致我的测试冻结,但这不是原因。看看我在tearDown方法中的尝试。我无法运行

  

getInstrumentation()。finish(0,new Bundle());

因为我得到了

  

测试未能完成。原因:'测试运行失败了   完成。预计3次测试,收到1'

我也跑不了

  

getInstrumentation()callActivityOnDestroy(活性);

因为我这里没有活动。此外,在启动时启动的Activity“StartTestActivity”与测试完成时运行的Activity不同,因为StartTestActivity启动另一个在测试结束时运行的Activity“MainMenuActivity”。我已经考虑过使用Instrumentation.ActivityMonitor,但这并没有提供所需的功能 不过我想以某种方式在每个测试用例中以相同的测试条件开始,因为整个测试本身在启动时都做了,但我不确定InstrumentationTestCase在后台做了什么,所以我不知道如何重启整个仪器建立。我不知何故需要停止并重新启动测试实例,或者可能有更好的解决方案?有任何想法吗? (顺便说一句:每个测试本身都运行良好,所以测试自己也没问题。)

public class WorkflowModule1Test extends InstrumentationTestCase
{
    private PersistenceManagerMock persistenceManager;

    @Override
    protected void setUp() throws Exception
    {
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception
    {
        super.tearDown();

        if (persistenceManager != null)
        {
            persistenceManager.clear();
        }
    }

    public void testSaveLocaleEN() throws PersistenceException
    {
        updateLocaleConfiguration(Locale.ENGLISH);

        Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getInstrumentation().startActivitySync(intent);

        persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class);

        List<Entity> entities = persistenceManager.getEntities();

        assertTrue(entities.size() == 1);
        assertTrue(entities.get(0) instanceof LanguageUsageRel);
        assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("EN"));
    }

    public void testSaveLocaleDE() throws PersistenceException
    {
        updateLocaleConfiguration(Locale.GERMAN);

        Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        getInstrumentation().startActivitySync(intent);

        persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class);

        List<Entity> entities = persistenceManager.getEntities();

        assertTrue(entities.size() == 1);
        assertTrue(entities.get(0) instanceof LanguageUsageRel);
        assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("DE"));
    }

    private void updateLocaleConfiguration(Locale locale)
    {
        Locale.setDefault(locale);
        Configuration configuration = new Configuration();
        configuration.locale = locale;
        getInstrumentation().getContext().getResources().updateConfiguration(configuration, getInstrumentation().getContext().getResources().getDisplayMetrics());
    }
}

2 个答案:

答案 0 :(得分:0)

我认为,如果你扩展ActivityInstrumentationTestCase2,这将解决你的很多问题。

另一个注意事项:在<{em> super.tearDown()来电之前,请将您的故事放下

答案 1 :(得分:0)

我自己找到了解决方案。我必须设置这两个标志。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);