posts - 88, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          Spring默認(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ì)象

          主站蜘蛛池模板: 宁晋县| 武陟县| 武穴市| 哈尔滨市| 济南市| 全椒县| 卢湾区| 龙岩市| 南阳市| 乐都县| 绥棱县| 平潭县| 宿松县| 宁阳县| 遂溪县| 九江县| 曲沃县| 磐安县| 鄂伦春自治旗| 柘荣县| 高平市| 布拖县| 封丘县| 买车| 蓬安县| 林甸县| 清涧县| 丰顺县| 四子王旗| 湛江市| 额敏县| 海丰县| 左权县| 济阳县| 正安县| 舟曲县| 漾濞| 丹阳市| 遂昌县| 霞浦县| 永安市|