2017-02-09 135 views
0

我的Junit測試代碼如下所示。手動bean自動裝配在JUnit測試中不起作用

private static boolean setupDone = false; 
private Box box; 

@Before 
public void setup(){ 

    if (setupDone){ 
    return true; 
    } 

    box = new BoxCreator(this.applicationContext); 

    applicationContext.getAutowireCapableBeanFactory().autowireBean(box); 

    setupDone = true; 
} 

@Test 
public void Test1(){ 
    String response = box.getBoxResponse(); 

    ...asserts go here as usual.... 
} 

@Test 
public void Test2(){ 
String response = box.getBoxResponse(); 

...asserts go here as usual.... 
} 

現在發生的情況是,Setup方法只會根據setupDone變量的需要運行一次。

創建Box對象的實例後自動調用它的設置方法如上面代碼中所示。意圖是擁有這個類的單例,並在每個測試中使用相同的實例。

現在問題是無論哪個測試方法首先運行獲取box對象的值,第二個測試方法將box看作null。不確定爲什麼當第二個測試方法執行時它變爲空。

回答

0

我懷疑它沒有爲每個測試方法的運行使用相同的測試類實例。

如果您使「盒子」靜態,它可能會更好。請注意,「setupDone」和「box」一起在@Before方法中進行初始化,應該位於相同的地方,無論其類爲靜態還是實例僅用於全局變量。

問題是,如果一個測試修改對象或其內部對象的狀態,則以下測試可能無法正常工作。

+0

那麼你的意思是說在同一個測試類中的不同測試會有不同的應用上下文? – Hary

+0

每個測試都有不同的「this」及其所有實例變量。靜態變量保留在類中,並且無論「this」的哪個實例都是相同的。 –

0

正如Lee Meador所說的,JUnit在調用每個@Test方法之前創建一個新的測試類實例。通過這樣做,它提供了測試方法之間的獨立性,並避免了測試代碼中的無意的副作用。每個測試都應單獨執行而不受前面測試的影響,因此在您的案例中應該有不同的應用上下文。

+0

那麼應用程序上下文或bean工廠在JUnit測試中如何工作呢?每個測試都會有它自己的測試類實例和一個單獨的應用程序上下文或bean工廠?它是如何工作的? – Hary

相關問題