posts - 88, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Junit @AfterClass訪問注入對象的方法

          Posted on 2017-04-15 10:32 Milo的海域 閱讀(597) 評論(0)  編輯  收藏 所屬分類: Java
          Spring默認不允許對類的變量, 也就是靜態變量進行注入操作, 但是在某些場景比如單元測試的@AfterClass要訪問注入對象, 而Junit的這個方法必須是靜態的, 也就產生了悖論;

          解決思路有兩個:

          • 思路1: 想辦法對靜態變量注入, 也就是繞過Spring只能運行非靜態變量才能注入依賴的壁壘
          • 思路2: 想辦法@AfterClass改造為非靜態
            • 實現Junit RunListener, 覆蓋testRunFinished方法, 這里去實現類似@AfterClass的功能, 這個方法是非靜態的
            • 不要用Junit, 改用TestNG, TestNG里的AfterClass是非靜態的
            • 用Spring的TestExecutionListeners, 實現個Listener, 里面也有個類似非靜態的AfterClass的實現, 覆蓋實現就行

          思路2的幾個方法都可以實現, 但是單元測試Runner需要用

          @RunWith(Theories.class)

          而且改用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 來個偷梁換柱而已, 多聲明個靜態成員指向非靜態對象, 兩者其實是一個對象

          主站蜘蛛池模板: 枣阳市| 横峰县| 灵宝市| 宣汉县| 抚州市| 克什克腾旗| 增城市| 克山县| 资源县| 隆昌县| SHOW| 通州区| 余江县| 侯马市| 金溪县| 大洼县| 雅江县| 汕尾市| 枣庄市| 诏安县| 岢岚县| 道孚县| 威海市| 黄浦区| 汾西县| 三原县| 南通市| 左贡县| 武隆县| 托克托县| 阿荣旗| 岑溪市| 崇礼县| 马鞍山市| 高陵县| 曲水县| 盐城市| 虎林市| 三明市| 佳木斯市| 绥中县|