2013-02-06 49 views
3

試圖創建一個構造函數,僅在我單位調用一次測試創建一個測試用例一個構造函數,以便它只會被調用一次

public class ArtistTest extends InstrumentationTestCase{ 
    private static final String TAG_NAME = "TESTING_SUITE"; 
    private TestingMusicDAO musicDAO; 
    private List<Song> songs; 
    private Instrumentation instr; 
    MusicService musicService; 

    public ArtistTest() throws Exception { 
     super();  
     instr = this.getInstrumentation(); 
     Log.d(TAG_NAME, "Setting up testing songs"); 
     musicDAO = new TestingMusicDAO(instr.getContext()); 
     musicService = new MusicServiceImpl(musicDAO); 
     musicDAO.getAllSongsFromFile(); 
     songs = musicDAO.getAllSongs(); 
     for(Song song : songs) 
      Log.d(TAG_NAME, song.toString()); 
    } 

但我得到一個異常的構造錯誤,當我運行該文件作爲Android Junit測試。此處還有堆棧跟蹤

junit.framework.AssertionFailedError: Exception in constructor: test0  (java.lang.NullPointerException 
at com.intellimec.ilane.ice.mediaservices.ArtistTest.<init>(ArtistTest.java:17) 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
at junit.runner.BaseTestRunner.getTest(BaseTestRunner.java:118) 
at android.test.AndroidTestRunner.getTest(AndroidTestRunner.java:148) 
at android.test.AndroidTestRunner.setTestClassName(AndroidTestRunner.java:56) 
at android.test.suitebuilder.TestSuiteBuilder.addTestClassByName(TestSuiteBuilder.java:80) 
at android.test.InstrumentationTestRunner.parseTestClass(InstrumentationTestRunner.java:444) 
at android.test.InstrumentationTestRunner.parseTestClasses(InstrumentationTestRunner.java:425) 
at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:370) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4382) 
at android.app.ActivityThread.access$1300(ActivityThread.java:141) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5039) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 
) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661) 

回答

2

將您只需要在代碼執行期間執行一次代碼轉換爲靜態初始化程序的代碼。它應該只運行一次,當類加載時(不要重用這個類)。

+0

我寧願使用構造函數/想知道這個異常的原因 –

+0

最終找不到解決方案,使用了這個解決方案。 –

0

你也可以寫你自己的設置()方法來初始化你的「音樂」的對象,一旦 看到這個網頁的詳細說明 http://www.methodsandtools.com/tools/tools.php?junit

+0

是的,我做過了,但是在junit中,每次測試都會調用該方法,因爲junit會將方法再次運行一次。隨着我每次生成音樂數據庫,使測試過程非常緩慢。因此,構造函數 –

0

什麼是ArtistTest.java:17

如果getInstrumentation剛剛返回private field instr然後在這裏調用返回空,導致NPE後

+0

super()的類的初始化。有解決方案嗎? –

+0

超類如何初始化子類的字段 –

+0

對不起,它顯示了構造函數的層次結構 –

0

不要使用混凝土構造的測試用例。

更好地遵循junit範例。

使用這些註釋來初始化每個類需要初始化的任何值。 即@BeforeClass和@AfterClass 確保您定義Ø初始化任何類級別

@BeforeClass 
public static void setUpBeforeClass() throws Exception { 
//per class attributes initialized here 
    instr = this.getInstrumentation(); 
    Log.d(TAG_NAME, "Setting up testing songs"); 
    musicDAO = new TestingMusicDAO(instr.getContext()); 
    musicService = new MusicServiceImpl(musicDAO); 
    musicDAO.getAllSongsFromFile(); 
    songs = musicDAO.getAllSongs(); 
    for(Song song : songs) 
     Log.d(TAG_NAME, song.toString()); 
} 

@AfterClass 
public static void tearDownAfterClass() throws Exception { 
//per class attributes destroyed here 
} 

爲您每方法需要的任何初始化,請使用以下注釋來告訴JUnit來初始化每這些值測試方法

@Before 
public void setUp() throws Exception { 
//per method attributes initialized here 

} 

@After 
public void tearDown() throws Exception { 
//per method attributes destroyed here 
} 

使用註釋@Test指定一個方法爲測試方法

@Test 
public void testMethodx() { 
} 
+0

這將工作在junit 4,但可悲的是我使用junit 3 –

相關問題