Always get thread error even if unit test passes in Android using Mockito

和自甴很熟 提交于 2019-12-23 10:28:09

问题


I always get an error even if a test passes and not sure why. This time i was checking there is a null pointer if the view is null.

@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();
 }

This is the stacktrace:

Exception in thread "Thread-2" android.database.sqlite.SQLiteException: Cannot prepare statement, base error code: -92
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getSqliteException(ShadowSQLiteConnection.java:632)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:601)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:525)
    at org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:93)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:994)
    at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java:811)
    at android.database.sqlite.SQLiteDatabase.getVersion(SQLiteDatabase.java:864)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:241)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
    at co.uk.rushorm.android.AndroidRushStatementRunner.runRaw(AndroidRushStatementRunner.java:37)
    at co.uk.rushorm.core.RushCore$12.statementCreated(RushCore.java:473)
    at co.uk.rushorm.core.implementation.ReflectionTableStatementGenerator.generateStatements(ReflectionTableStatementGenerator.java:46)
    at co.uk.rushorm.core.RushCore.createTables(RushCore.java:469)
    at co.uk.rushorm.core.RushCore.access$200(RushCore.java:39)
    at co.uk.rushorm.core.RushCore$1.run(RushCore.java:130)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.concurrent.ExecutionException: com.almworks.sqlite4java.SQLiteException: [-92] DB[1] is not confined or already disposed
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:142)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:596)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:525)
    at org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:93)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.robolectric.internal.bytecode.ShadowWrangler$ShadowMethodPlan.run(ShadowWrangler.java:548)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.$$robo$$acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.$$robo$$prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java)
    at android.database.sqlite.SQLiteSession.$$robo$$prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java)
    at android.database.sqlite.SQLiteProgram.$$robo$$__constructor__(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
    at android.database.sqlite.SQLiteDatabase.$$robo$$compileStatement(SQLiteDatabase.java:994)
    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java)
    at android.database.DatabaseUtils.$$robo$$longForQuery(DatabaseUtils.java:811)
    at android.database.DatabaseUtils.longForQuery(DatabaseUtils.java)
    at android.database.sqlite.SQLiteDatabase.$$robo$$getVersion(SQLiteDatabase.java:864)
    at android.database.sqlite.SQLiteDatabase.getVersion(SQLiteDatabase.java)
    at android.database.sqlite.SQLiteOpenHelper.$$robo$$getDatabaseLocked(SQLiteOpenHelper.java:241)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java)
    at android.database.sqlite.SQLiteOpenHelper.$$robo$$getWritableDatabase(SQLiteOpenHelper.java:163)
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java)
    ... 7 more
Caused by: com.almworks.sqlite4java.SQLiteException: [-92] DB[1] is not confined or already disposed
    at com.almworks.sqlite4java.SQLiteConnection.checkThread(SQLiteConnection.java:1386)
    at com.almworks.sqlite4java.SQLiteConnection.prepare(SQLiteConnection.java:451)
    at com.almworks.sqlite4java.SQLiteConnection.prepare(SQLiteConnection.java:542)
    at com.almworks.sqlite4java.SQLiteConnection.prepare(SQLiteConnection.java:529)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$2.call(ShadowSQLiteConnection.java:529)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$2.call(ShadowSQLiteConnection.java:525)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    ... 1 more

Why would sql exception appear on a show view ui if view exists? Stuck on this, for i find it in every test almost. Any ideas would be great. Thank you.


回答1:


Judging by this line:

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

And by the previous line

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

one may conclude, that what checkThread does is it checks, whether the query is being performed on a thread that the database has originally been created on, and that check does NOT pass.

Make sure you are creating and querying the database on the same thread. Basically, you have to dedicate a separate thread for database operations.

Here's the checkThread() method from the sources:

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

And myConfinement is null-ed in dispose() method. Thus, also make sure you have not dispose()-ed from the connection.



来源:https://stackoverflow.com/questions/41848392/always-get-thread-error-even-if-unit-test-passes-in-android-using-mockito

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!