相关疑难解决方法(0)

在没有第三方框架的情况下测试Android活动时如何注入依赖关系?

我想测试一个CommentActivity通常构造和使用实例的Android活动CommentsDataSource(两者都是我写的类).

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

我愿意创建MockCommentsDataSource自己,并希望避免使用第三方模拟框架.(为什么?因为我的教学试图减少我需要填写的学期信息量以及学生需要安装的软件数量.我看过其他帖子推荐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() …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection abstract-factory android-testing

7
推荐指数
1
解决办法
792
查看次数

使用MockContentResolver进行查询会导致NullPointerException

我们有一个扩展的JUnit测试类ActivityInstrumentationTestCase2<CommentActivity>.测试(以及我们正在测试的类)使用CommentContentProvider扩展ContentProvider来访问SQLite数据库,并且NullPointerException在提供程序上运行查询时,我们得到了[下面的完整堆栈跟踪].

我们实例化一个MockContentResolver,如下所示:

MockContentResolver mResolver;

public void setUp() {
    super.setUp();
    CommentContentProvider ccp = new CommentContentProvider();
    mResolver = new MockContentResolver();
    mResolver.addProvider(CommentContentProvider.AUTHORITY, ccp);
}
Run Code Online (Sandbox Code Playgroud)

稍后,在我们的测试中,当调用以下代码时,我们得到一个NullPointerException:

Cursor mCursor = mResolver.query(Uri.parse(mUri), null, null, null, null);
Run Code Online (Sandbox Code Playgroud)

即使我们等待实例化,MockContentResolver直到我们有一个被测活动的副本,我们也会得到相同的结果:

mActivity = getActivity();
MockContentResolver mResolver = new MockContentResolver(mActivity);
Run Code Online (Sandbox Code Playgroud)

我们已经确认mActivity不是空的.

一位同事介入Android源代码(未安装在我们的系统上),发现错误的最直接原因是在ContentProvider.enforceReadPermissionInner()getContext()第一行返回null .

我们看了一下这个看起来很相似的问题,但我认为这完全是一个不同的问题. 这个问题也是问题的类似症状,但他们没有实例化他们的问题MockContentResolver.我们在实例化我们时遇到了问题.

这是我们得到的堆栈跟踪:

java.lang.NullPointerException
at android.content.ContentProvider$Transport.enforceReadPermissionInner(ContentProvider.java:449)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:394)
at android.content.ContentProvider$Transport.query(ContentProvider.java:194) …
Run Code Online (Sandbox Code Playgroud)

android nullpointerexception android-contentresolver android-contentprovider

5
推荐指数
1
解决办法
1520
查看次数