我想测试一个通常构造并使用CommentActivity实例的Android Activity 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似乎并不实际,为了通过开始于IntentCommentActivity传递它们,必须将它们设置为。虽然我可以轻松地传递调试标志,但使用它会需要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版本。

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

最佳答案

这里有两个想法:

未使用工厂:

这可能仅对单元测试有效,而对集成测试无效:

  • 创建一个返回CommentDataSource的方法,例如getCommentsDataSource()
  • 创建一个继承CommentActivity的类
  • 使用返回MockCommentsDataSource的方法重写getCommentsDataSource()
  • 测试新类

  • 使用工厂:

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

    希望这可以帮助!

    10-08 16:49