即使使用Mockito在Android中通过单元测试,也始终会出现线程错误

时间:2017-01-25 09:54:52

标签: android mocking mockito powermockito

即使测试通过而且不确定原因,我总是会收到错误。这次我检查如果视图为空则有一个空指针。

 this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource());
        List<ReportParameter> rptParams = new List<ReportParameter>();
        ReportParameter param = new ReportParameter("paramSuchwort");
        param.Values.AddRange(sw.ToArray());
        rptParams.Add(param);
        this.reportViewer1.LocalReport.SetParameters(rptParams)

这是堆栈跟踪:

@Before
public void setUp() {
   MockitoAnnotations.initMocks(this);
   mockView = mock(CollectionContract.View.class);
   // Get a reference to the class under test
   presenter = new CollectionPresenter(repository, mockView);
}


@Test(expected = NullPointerException.class)
  public void testShowingUIWhenViewIsNull() {
      presenter = new CollectionPresenter(repository, null);
      verify(mockView).showAddCollection();
 }

如果视图存在,为什么在show view ui上会出现sql异常?坚持这一点,因为我几乎在每次测试中都能找到它。任何想法都会很棒。谢谢。

1 个答案:

答案 0 :(得分:1)

从这条线来判断:

Caused by: com.almworks.sqlite4java.SQLiteException: [-92] DB[1] is not confined or already disposed

前一行

at com.almworks.sqlite4java.SQLiteConnection.checkThread(SQLiteConnection.java:1386)

可以得出结论,checkThread做的是它检查,是否正在最初创建数据库的线程上执行查询,并且该检查未通过。

确保您在同一个线程上创建和查询数据库。基本上,您必须为数据库操作专用一个单独的线程。

这里是sourcescheckThread()方法:

void checkThread() throws SQLiteException {
    Thread confinement = myConfinement;
    if (confinement == null) {
      throw new SQLiteException(WRAPPER_MISUSE, this + " is not confined or already disposed");
    }
    ...
}

myConfinementnull - dispose()方法。因此,还要确保您没有dispose() - 来自连接。