5

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.

Gabi Radu
  • 1,107
  • 2
  • 16
  • 35
  • 1
    Post your existing original code which you are testing. – Noorul Feb 01 '17 at 13:08
  • @user1140656 Please post the code for showAddCollection() method. – Anurag Singh Feb 06 '17 at 13:33
  • Why do you repeat this line? `presenter = new ...` And why don't you use your mock in the test-method? And why don't you call the `class under test` with `classUnderTest` or `sut`, then you would not need a comment with `// Get a reference to the class under test` in your source. – Tobias Otto Feb 06 '17 at 16:39

1 Answers1

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.

Abdul Karim
  • 4,359
  • 1
  • 40
  • 55
azizbekian
  • 60,783
  • 13
  • 169
  • 249