posts - 88, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Junit @AfterClass访问注入对象的方法

Posted on 2017-04-15 10:32 Milo的海域 阅读(581) 评论(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 来个偷梁换柱而已, 多声明个静态成员指向非静态对象, 两者其实是一个对象


只有注册用户登录后才能发表评论。


网站导航: