Posted on 2017-04-15 10:32
Milo的海域 閱讀(592)
評論(0) 編輯 收藏 所屬分類:
Java
Spring默認不允許對類的變量, 也就是靜態變量進行注入操作, 但是在某些場景比如單元測試的@AfterClass要訪問注入對象, 而Junit的這個方法必須是靜態的, 也就產生了悖論;
解決思路有兩個:
思路1: 想辦法對靜態變量注入, 也就是繞過Spring只能運行非靜態變量才能注入依賴的壁壘
思路2: 想辦法@AfterClass改造為非靜態
實現Junit RunListener, 覆蓋testRunFinished方法, 這里去實現類似@AfterClass的功能, 這個方法是非靜態的
不要用Junit, 改用TestNG, TestNG里的AfterClass是非靜態的
用Spring的TestExecutionListeners, 實現個Listener, 里面也有個類似非靜態的AfterClass的實現, 覆蓋實現就行
思路2的幾個方法都可以實現, 但是單元測試Runner需要用
而且改用TestNG工程浩大, 只能放棄掉這個思路
繼續走思路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 來個偷梁換柱而已, 多聲明個靜態成員指向非靜態對象, 兩者其實是一個對象