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