PowerMock扩展自Mockito,实现了Mockito不支持的模拟形式的单元测试。PowerMock实现了对静态方法、构造函数、私有方法以及final方法的模拟支持,对静态初始化过程的移除等强大的功能。(官方)
接下来,通过实例来实现对SpringMVC的Controller层的方法模拟测试。
一、maven引入PowerMock相应的Jar文件
1 <dependency> 2 <groupId>org.powermock</groupId> 3 <artifactId>powermock-api-mockito</artifactId> 4 <version>1.6.5</version> 5 </dependency> 6 7 <dependency> 8 <groupId>org.powermock</groupId> 9 <artifactId>powermock-module-junit4</artifactId> 10 <version>1.6.5</version> 11 </dependency>
二、单元测试基类
1 import org.junit.runner.RunWith; 2 import org.powermock.core.classloader.annotations.PowerMockIgnore; 3 import org.powermock.modules.junit4.PowerMockRunner; 4 import org.powermock.modules.junit4.PowerMockRunnerDelegate; 5 import org.springframework.test.context.ContextConfiguration; 6 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 7 import org.springframework.test.context.transaction.TransactionConfiguration; 8 import org.springframework.transaction.annotation.Transactional; 9 10 @RunWith(PowerMockRunner.class) //使用PowerMockRunner运行时 11 @PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class) //委派给SpringJUnit4ClassRunner 12 @ContextConfiguration (locations={"classpath:META-INF/app_config/context/context-*.xml"}) //加载配置文件 13 @Transactional 14 @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 15 @PowerMockIgnore({"javax.management.*"}) //忽略一些mock异常 16 public class BaseJunit4 { 17 18 }
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class):PowerMock与Spring整合时最重要的配置
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback =true): 这里的事务关联到项目的配置文件中的事务控制器("transactionManager"),同时指定事物自动回滚(defaultRollback= true),以此对数据库不会产生数据污染。
三、单元测试类
对Controller测试时,还需要由Controller层中的Action去执行相应的业务代码,对于Action的依赖注入就可以非常方便的使用ReflectionTestUtils.setField(controller,"assetScrapHandleAction",aSHAction)(非常重要),将aSHAction注入到controller层中的属性名为assetScrapHandleAction中
@PrepareForTest({OrgUtils.class,UserUtils.class}) 注解一定要放到类上,或者基类上也可以,千万不能放到方法上。如果在方法上,会导致每执行一次test方法,都会委托SpringJUnit4ClassRunner去加载一次上下文配置,将直接导致内存耗尽。
四、Controller层代码实例
UserUtils.getLoginUserCom().getLeavel();执行时,返回“L0”
UserUtils.getUser().getUser().getOrgCode();执行时,返回“1100”
这些都是PowerMock的功劳!