PowerMock编写模拟JDBC静态方法获取Connection的Junit测试用例
最近在写单元测试用例,需要模拟jdbc静态方法获取连接数据库connection,各种研究分析,发现了有PowerMock可以模拟静态方法和私有方法,然后在使用PowerMock的过程中走过了各种坑,总算是执行成功了,现总结如下:
1、检查相关jar依赖,避免版本冲突出现各种未知报错
JUnit 4.12 and PowerMock >= 1.6.1
具体依赖如下:
'junit:junit:4.12', 'org.powermock:powermock-core:1.6.1', 'org.powermock:powermock-module-junit4:1.6.1', 'org.powermock:powermock-api-mockito:1.6.1'
|
Mockito和PowerMock不同版本对应说明:
2、相关dependency
<!-- mockito--> <dependency> <groupId>org.mockito</groupId><artifactId>mockito-all</artifactId> <version>2.0.0-beta</version> <scope>test</scope> </dependency> <!-- junit单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!-- 表示开发的时候引入,发布的时候不会加载此包 --> <scope>test</scope> </dependency> <!-- powermock --> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.6.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.6.5</version> <scope>test</scope> </dependency> <!-- mockConnection--> <dependency> |
3、具体测试用例实例
@RunWith(PowerMockRunner.class) @PrepareForTest({ JDBCTools.class }) public class JDBCDaoTest { private Logger logger = Logger.getLogger(JDBCDaoTest.class); @Before public void before() { PowerMockito.mockStatic(JDBCTools.class); } @Test public void test() { List<RunGroupInfo> rungroupList = new ArrayList<RunGroupInfo>(); RunGroupInfo rungroupInfo = new RunGroupInfo(); rungroupInfo.setId("1"); rungroupInfo.setName("aaa"); rungroupInfo.setProvince("江苏省"); rungroupInfo.setCity("苏州市"); rungroupInfo.setUserName("bb"); rungroupInfo.setEntryNum(2); rungroupInfo.setIsOfficial(1); rungroupList.add(rungroupInfo); try { //模拟MockConnection MockDataProvider provider = new MockDataProvider() {@Override public MockResult[] execute(MockExecuteContext arg0) throws SQLException { return new MockResult[] { new MockResult(1) }; } }; Connection con = new MockConnection(provider); PowerMockito.when(JDBCTools.getConnection()).thenReturn(con); JDBCDao.addRungroupInfo(rungroupList); JDBCDao.deleteThenInsertRungroup(rungroupList); } catch (Exception e) { logger.info(e); } } } |
分析:标红部分是必须要有的,否则模拟静态方法失效。绿色部分为模拟jdbc connection,避免真实连接数据库。