android - 在没有第三方框架的情况下测试 Android Activity 时如何注入(inject)依赖项?

标签 android dependency-injection android-testing abstract-factory

我想测试一个 Android Activity CommentActivity,它通常构造和使用 CommentsDataSource 的实例(都是我编写的类)。

public class CommentActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    :
    CommentsDataSource = new CommentsDataSource(..);
    :
  }
  :
}

我愿意自己创建 MockCommentsDataSource 并希望避免使用第三方模拟框架。 (为什么?因为我是一名教师,试图减少我需要塞进学期的信息量和我的学生需要安装的软件数量。我看到 other posts 推荐 Guice、roboguice 和 Spring。 )

我的问题是如何将 CommentsDataSource(或 MockCommentsDataSource)传递给 Activity。使它们成为 SerializableParcelable 似乎不切实际,它们必须是这样才能通过 Intent 传递启动 CommentActivity。虽然我可以很容易地传入调试标志,但使用它需要 CommentActivity 了解 MockCommentsDataSource,这实际上与它无关(并且在单独的应用程序中):

public class CommentActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    :
    debugMode = getIntent().getBooleanExtra(DEBUG_MODE, false);

    // Get a connection to the database.
    final CommentsDataSource cds = (debugMode ? 
      new MockCommentsDataSource() :   // Abstraction violation
      new CommentsDataSource(this));
      :
   }
   :
}

我应该如何将 MockCommentsDataSource 注入(inject)到 CommentActivity 中? FWIW,我正在使用 Eclipse 并正在针对最新的 SDK 版本进行开发。

我想到的一个解决方案是使用抽象工厂模式,因为使工厂可序列化相对容易。考虑到我的限制,这是最好的方法吗?

最佳答案

这里有两个想法:

不使用工厂:

这可能只适用于单元测试而不适用于集成测试:

  1. 创建一个返回 CommentsDataSource 的方法,例如getCommentsDataSource()
  2. 创建一个继承CommentActivity的类
  3. 用返回 MockCommentsDataSource 的方法覆盖 getCommentsDataSource()
  4. 测试新类(class)

使用工厂:

如您所述,您可以更改 CommentActivity 代码以从工厂方法获取 CommentsDataSource。这样您就可以让工厂方法返回模拟类。

希望这对您有所帮助!

关于android - 在没有第三方框架的情况下测试 Android Activity 时如何注入(inject)依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22121911/

相关文章:

Android:Google Playstore 的公测

java - 主要 Activity 的后退按钮 - 正常行为?

c# - 构造函数注入(inject) (DI) 与静态工厂的横切问题?

c# - 我需要 Unity 容器的单个实例吗?

design-patterns - 害怕使用依赖注入(inject)框架

android - 测试 fragment (Android),模拟 getActivity() 调用

android - firebase datasnshot 控制子项

android - 内存高效地下载和解析 JSON

android - 如何在 Android 上管理 startActivityForResult

Android Integration 测试应用权限