2015-05-19 31 views
21

我必須建立一個應用程序使用sqlite。現在我想寫我的單元測試。這些單元測試應該測試我的類SQLiteBridgeSQLiteBridge爲模型的每個子類提供DAO。Android JUnit4測試 - 從哪裏獲取上下文?

現在我遇到了需要上下文來創建我的SQLiteBridge的問題。 SQLiteBridge創建並處理系統上的SQLite數據庫。

從何處獲取上下文對象?

我的設置是像這裏(所以我使用Junit4 [感謝上帝): http://tools.android.com/tech-docs/unit-testing-support

編輯:我希望有像老AndroidTestCase辦法不失Junit4延伸。 :)

回答

50

如此處所述:https://code.google.com/p/android-test-kit/wiki/AndroidJUnitRunnerUserGuide 使用InstrumentationRegistry獲取上下文。

但是,如果您直接致電InstrumentationRegistry.getContext(),則可能會打開數據庫時發生異常。我相信這是因爲getContext()返回的上下文指向的是工具的上下文,而不是您的應用程序/單元測試的上下文。而是使用InstrumentationRegistry.getInstrumentation().getTargetContext()

例如:

@RunWith(AndroidJUnit4.class) 
public class SqliteTest { 

    Context mMockContext; 

    @Before 
    public void setUp() { 
     mMockContext = new RenamingDelegatingContext(InstrumentationRegistry.getTargetContext(), "test_"); 
    } 
} 

的RenamingDelegatingContext簡單地TEST_前綴的文件/數據庫名,以防止您覆蓋,你可以在同一個仿真數據。

+0

我剛試過,它的工作! 我想我會使用Robolectric ..但是感謝這個解決方案! :) –

+0

我試過這個,它的工作原理,但前綴被忽略,因此在測試中使用「真正的」數據庫。任何想法爲什麼這可能會發生? – moarCoffee

+3

InstrumentationRegistry不能作爲符號解析 –