2017-01-25 13 views
5

का उपयोग करके एंड्रॉइड में यूनिट परीक्षण पास होने पर भी थ्रेड त्रुटि प्राप्त करें, भले ही कोई परीक्षा उत्तीर्ण हो और सुनिश्चित न हो कि मुझे हमेशा एक त्रुटि मिलती है। इस बार जब मैं देख रहा था कि दृश्य शून्य है तो एक शून्य सूचक है।मॉकिटो

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 

क्यों एसक्यूएल अपवाद दृश्य मौजूद रहने पर एक शो देखने ui पर प्रकट होगा:

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

यह स्टैकट्रेस है? इस पर अटक गया, क्योंकि मैं इसे लगभग हर परीक्षण में पाता हूं। सभी विचारों का स्वागत है। धन्यवाद।

+1

अपने मौजूदा मूल कोड को पोस्ट करें जिसे आप परीक्षण कर रहे हैं। – Noorul

+0

@ user1140656 कृपया showAddCollection() विधि के लिए कोड पोस्ट करें। –

+0

आप इस लाइन को दोहराते क्यों हैं? 'प्रस्तुतकर्ता = नया ...' और आप टेस्ट-विधि में अपने नकली का उपयोग क्यों नहीं करते? और आप 'classUnderTest' या' sut' के साथ 'कक्षा के तहत परीक्षण' क्यों नहीं कहते हैं, तो आपको अपने स्रोत में 'परीक्षण के तहत कक्षा के संदर्भ प्राप्त करने' के साथ टिप्पणी की आवश्यकता नहीं होगी। –

उत्तर

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 करता है यह जाँच करता है, चाहे क्वेरी एक धागा पर प्रदर्शन किया जा रहा है कि डेटाबेस मूल रूप से बनाया गया है, और वह चेक पास नहीं होता है।

सुनिश्चित करें कि आप एक ही थ्रेड पर डेटाबेस बना रहे हैं और क्वेरी कर रहे हैं। असल में, आपको डेटाबेस संचालन के लिए एक अलग थ्रेड समर्पित करना होगा।

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

और myConfinementnulldispose() विधि में एड है:

यहाँ sources से checkThread() विधि है। इस प्रकार, यह भी सुनिश्चित करें कि आपके पास कनेक्शन से dispose() नहीं है।