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的功勞!