0

我通过运行从库项目“派生”的测试实现来运行我的 Android 测试(因为我有一个带有 baselib 和“具体应用程序项目”的多模块项目)。测试实现是这些具体的应用程序项目之一,由 InstrumentationTestCase 启动。在这个测试用例中,我模拟了 RoboGuice 库项目中的几个部分。这意味着我使用模拟类(如持久性处理、数据库处理等)运行我的 baselib 的“真实”实现。为了做到这一点,每个测试用例都必须关闭并重新启动整个测试实例,因为我不能在设备上两次启动同一个应用程序。这些测试是比 Junit 测试更多的集成测试,因为我测试了某种工作流,但没有其他可能性来测试它,因为在 Android 测试中使用 JUnit 的可能性似乎非常有限。目前我只能同时运行一个测试用例,因为如果我运行超过 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());
    }
}
4

2 回答 2

0

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

另一个注意事项:将您的拆解逻辑放在通话之前。super.tearDown()

于 2013-06-02T19:14:29.667 回答
0

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

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
于 2013-06-05T06:37:47.557 回答