【问题标题】:I am trying to unit test a custom Dialog in Android and I can't seem to instantiate it我正在尝试在 Android 中对自定义对话框进行单元测试,但我似乎无法实例化它
【发布时间】:2011-02-15 15:25:48
【问题描述】:

我正在对包含自定义对话框的应用程序进行单元测试。该对话框继承自android.app.Dialog,但需要Activity 的特殊子类,我们称之为CustomActivity,它提供了它需要的一些功能。

我想避免从测试的应用程序中实例化其中一个活动,因为我已经对它们进行了测试。我是单元测试,而不是黑盒测试,所以我想在对话框中运行所有公共功能。但是,如果不先实例化对话框,这是不可能的,这需要 CustomActivity 实例。

我尝试创建 CustomActivity 的模拟子类并使用它来启动对话框,但我一直遇到同样的问题:测试应用程序不在测试应用程序中寻找活动,只在测试的应用程序。所以我得到“无法解决活动”。

我也尝试自己创建活动,但不使用Instrumentation.launchActivity,但这需要一个上下文,而我在InstrumentationTestCase 下没有。如果我改用AndroidTestCase,则提供的上下文(通过getContext)只是一个ContextWrapper,它似乎没有包含任何上下文,所以我回到了原点。我需要先实例化 Activity。

我用谷歌搜索了很多,我不敢相信我是第一个需要对Dialog 进行单元测试的人。在我看来,我需要类似于 ActivitiTestCase2 的东西,但对于提供必要上下文的对话框。

创建对话框的最佳方式是什么?还有另一种我没有尝试过的方法吗?有人有自定义对话框单元测试的示例吗?

【问题讨论】:

    标签: android unit-testing dialog


    【解决方案1】:

    这听起来像是面向对象的问题,而不是 Android 问题。我认为您的核心问题可能是类之间的紧密耦合。尝试在 CustomActivity 前面引入一个仅公开对话框所需功能的接口,然后在测试中模拟该接口,而不是尝试创建 Activity 本身的模拟子类。祝你好运!

    【讨论】:

    • 这是个好建议。你真的试过这个吗?是否可以在没有 Activity 的情况下实例化一个对话框? android 系统中似乎已经存在一些紧密耦合。 :)
    • 我试过了,我怀疑如果没有实际的活动上下文发送到它,就不可能显示对话框。这里有很多 Android 魔法,我发现自己在苦苦挣扎。测试一个对话框真的应该这么难吗?
    • 我认为您介意实例化 CustomActivity 的原因是它难以处理。使用上述技术,您可能仍然需要使用活动上下文,但您可以使用非常简单的活动。如果您的应用程序还没有包含一个非常简单的活动,您可以添加一个空白活动并在您的测试中使用它作为上下文。诚然,这并不完美,但它确实有效。如果有人有更好的解决方案,我也很乐意听到,而且你认为 Android 的设计中存在与这些东西相关的一些缺陷是正确的。
    • 感谢您的回复!但是,我 am 试图将我的 CustomActivity(一个抽象类)实例化为一个模拟子类(如上所述),我的问题是我无法以正确的方式实例化它,因为我在InstrumentationTestCaseAndroidTestCase 中都没有必要的先决条件。我不使用ActivityInstrumentationTestCase2 的原因是我没有对活动进行单元测试,而是对对话框进行单元测试。我很困难,我知道,但这是一个重要的区别。一个我可能不得不放弃的……
    • 明白了。如果是我,我会在那里做出一些让步,但我当然明白你来自哪里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多