PowerMock
是一个单元测试框架,可以模拟静态方法,私有方法和final
方法等来简化单元测试的编写。本篇文章将对使用PowerMock
需要的依赖进行介绍。
在使用PowerMock
时需要针对不同场景添加对应注解,主要是@RunWith
和@PrepareForTest
注解。注解添加和场景对应如下所示。
场景 | 注解 |
---|---|
模拟final方法 | @PrepareForTest ,@RunWith |
模拟静态方法 | @PrepareForTest ,@RunWith |
模拟私有方法 | @PrepareForTest |
使用whenNew | @PrepareForTest ,@RunWith |
@PrepareForTest
注解用于告诉PowerMock
需要准备某些类进行测试,这些类包括final
类,带有final
,private
,static
或native
方法的类,上述类需要PowerMock
基于字节码进行操作。可以按照@PrepareForTest(TestObj.class)
的方式来告诉PowerMock
准备TestObj
类进行测试。
@RunWith
注解用于告诉JUnit
使用哪个运行类来运行@RunWith
注解修饰的类中的测试程序,例如@RunWith(PowerMockRunner.class)
,则告诉JUnit
使用PowerMockRunner
来运行@RunWith
注解修饰的类中的测试程序。
PowerMock
需要添加的依赖需要引入的依赖如下所示。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.23.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
引入mockito-core
是为了提供Mockito
功能,主要使用到org.mockito.ArgumentMatchers
参数占位符,部分情况需要使用到org.mockito.BDDMockito
。引入powermock-api-mockito2
和powermock-module-junit4
是为了提供PowerMock
功能,其中powermock-module-junit4
中还引入了hamcrest-core
,主要是使用其提供的org.hamcrest.MatcherAssert.assertThat
和org.hamcrest.Matchers.is
进行断言判断。
在引入依赖时,需要注意核对Mockito
和PowerMock
的版本对应关系,否则会报java.lang.ClassNotFoundException: org.mockito.exceptions.Reporter
错误。版本对应关系可以去PowerMock
官网进行查询:PowerMock官网,通常情况下,如果引入的mockito-core
版本为2.x,则PowerMock
的api需要使用powermock-api-mockito2
。