我想测试一个 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。使它们成为 Serializable
或 Parcelable
似乎不切实际,它们必须是这样才能通过 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 版本进行开发。
我想到的一个解决方案是使用抽象工厂模式,因为使工厂可序列化相对容易。考虑到我的限制,这是最好的方法吗?
最佳答案
这里有两个想法:
不使用工厂:
这可能只适用于单元测试而不适用于集成测试:
- 创建一个返回 CommentsDataSource 的方法,例如getCommentsDataSource()
- 创建一个继承CommentActivity的类
- 用返回 MockCommentsDataSource 的方法覆盖 getCommentsDataSource()
- 测试新类(class)
使用工厂:
如您所述,您可以更改 CommentActivity 代码以从工厂方法获取 CommentsDataSource。这样您就可以让工厂方法返回模拟类。
希望这对您有所帮助!
关于android - 在没有第三方框架的情况下测试 Android Activity 时如何注入(inject)依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22121911/