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不同版本对应说明:

PowerMock编写模拟JDBC静态方法获取Connection的Junit测试用例

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>
  <groupId>org.jooq</groupId>
  <artifactId>jooq</artifactId>
  <version>3.11.2</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>jooq-meta</artifactId>
  <version>3.11.2</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.jooq</groupId>
  <artifactId>jooq-codegen</artifactId>
  <version>3.11.2</version>
  <scope>test</scope>
</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,避免真实连接数据库。