Always get a stream error, even if unit test passes in Android using Mockito

I always get an error, even if the test passes and is not sure why. This time I checked for 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 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 does sql exception appear in show ui view if view exists? Stuck on this because I find it in almost every trial. Any ideas would be great. Thanks.

+5
source share
1 answer

Judging by this line:

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

And on the previous line

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

we can conclude that what checkThread does checks whether the request in the thread that the database originally created is running and that the check does NOT pass.

Make sure you create and query the database in the same thread. Basically, you should allocate a separate thread for database operations.

Here's the checkThread() method from 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 the dispose() method. Thus, also make sure that you do not have dispose() -ed from the connection.

+1
source

Source: https://habr.com/ru/post/1263313/


All Articles