2015-04-06 148 views
2

我想爲一個靜態方法編寫一個單元測試,它需要一個類和方法名稱,並執行一些反射來調用具有參數的方法並存儲結果。我正在使用spring-boot如何根據springBoot的applicationContext單元測試方法?

當我運行完整套件時,我的測試實際上工作,但是當我作爲獨立運行測試時,它失敗。問題是我創建了一個模擬類(手寫模擬,不使用mockitoeasymock),我希望使用靜態方法。但是,反射無法檢測到我的模擬類,因爲該類尚未被spring-boot加載到applicationContext中。下面是失敗行:

T proxy = SpringApplicationContext.getBean(clazz); 

SpringApplicationContext定義:

@Component 
public class SpringApplicationContext implements ApplicationContextAware 
{ 
    private static ApplicationContext applicationContext_; 

@Override 
public void setApplicationContext(ApplicationContext applicaitonContext) throws BeansException { 
    applicationContext_=applicaitonContext; 
} 

public static <T> T getBean(Class<T> requiredType) throws beanException { 
     return applicationContext_.getBean(requiredType); 
} 

*注意,我不得不手動重新輸入,請假設明顯的語法錯誤,錯別字。

所以基本上我的applicationContext沒有被設置或定義。我只需要applicationContext中的一個模擬bean,我可以手動完成,但是有更多spring方法使用註釋嗎?

+0

這聽起來像你溜得太快了[第11章](http://docs.spring.io/spring (當前)Spring文檔的/docs/current/spring-framework-reference/html/testing.html)!請仔細看看,特別是在[§11.3.4](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#integration-testing-annotations)中,不要忘記:http://docs.spring.io/spring-batch/trunk/reference/html/testing.html,也許是一些示例:http://codesolid.com/spring-unit-testing-using-junit/ – xerx593

回答

1

事實證明,我的測試不起作用,而是獨立運行或套件的一部分運行,我有一個單獨的問題,使用@BeforeTest的錯誤註釋來掩蓋運行整個套件時的缺陷。

修復很簡單。我加了註釋SpringApplicationConfiguration上面我的測試:

@SpringApplicationConfiguration(classes = 
    { 
     MockController.class, 
     SpringApplicationContext.class 
    } 
public class MyTest extends AstractTestNGSpringContextTests 

有兩個環節進行。 @SpringApplicationCOnfiguration只加載我列出的那些值。我可以指向配置類,但是最終會在我的環境中加載大部分的bean,這對單元測試來說太過分了。所以我加載我的ApplicationContext中需要的兩個@component對象,以便我的單元測試只能工作。

我還必須擴展AbstractTestNGSpringContextTests,因爲它是讓Spring與TestNG工具箱一起使用以進行測試的唯一方法。如果別人使用JUnit測試來代替TestNG的不延長AbstracTestNGSpringContextTests的,而是我相信你想添加的註釋:

@RunWith(SpringJUnit4ClassRunner.class) 

雖然因爲我沒有使用JUnit我沒有用它。

希望這個答案可以拯救那些試圖弄清楚如何只加載幾個類而不是整個環境的人(我發現的大多數例子都希望你加載配置文件來加載每一個bean,這是緩慢且誠實不可取的在單元測試中)。

按理說我應該還是有嘲笑了SpringApplicationContext完全,我懶惰,馬虎:)