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