Posted on 2017-04-15 10:32
Milo的海域 閱讀(592)
評論(0) 編輯 收藏 所屬分類:
Java
Spring默認不允許對類的變量, 也就是靜態(tài)變量進行注入操作, 但是在某些場景比如單元測試的@AfterClass要訪問注入對象, 而Junit的這個方法必須是靜態(tài)的, 也就產(chǎn)生了悖論;
解決思路有兩個:
思路1: 想辦法對靜態(tài)變量注入, 也就是繞過Spring只能運行非靜態(tài)變量才能注入依賴的壁壘
思路2: 想辦法@AfterClass改造為非靜態(tài)
實現(xiàn)Junit RunListener, 覆蓋testRunFinished方法, 這里去實現(xiàn)類似@AfterClass的功能, 這個方法是非靜態(tài)的
不要用Junit, 改用TestNG, TestNG里的AfterClass是非靜態(tài)的
用Spring的TestExecutionListeners, 實現(xiàn)個Listener, 里面也有個類似非靜態(tài)的AfterClass的實現(xiàn), 覆蓋實現(xiàn)就行
思路2的幾個方法都可以實現(xiàn), 但是單元測試Runner需要用
而且改用TestNG工程浩大, 只能放棄掉這個思路
繼續(xù)走思路1, 只能去繞過Spring的依賴注入的static壁壘了, 具體代碼如下:
@Autowired
private Destination dfsOperationQueue;
private static Destination dfsOperationQueueStatic; // static version
@Autowired
private MessageQueueAPI messageQueueAPI;
private static MessageQueueAPI messageQueueAPIStatic; // static version
@PostConstruct
public void init() {
dfsOperationQueueStatic = this.dfsOperationQueue;
messageQueueAPIStatic = this.messageQueueAPI;
}
@AfterClass
public static void afterClass() {
MessageVO messageVO = messageQueueAPIStatic.removeDestination(dfsOperationQueueStatic);
System.out.println(messageVO);
}
其實就是用了@PostConstruct 來個偷梁換柱而已, 多聲明個靜態(tài)成員指向非靜態(tài)對象, 兩者其實是一個對象