最近一直在重构公司的Java代码,由于原来并没有相关的测试,所以在重构之前先加上单元测试可以对重构代码的正确性有一定的保障作用,研究了一下如何使用PowerMock写测试代码(单元测试+集成测试)
PowerMock基于Mockito做了部分改进,主要是加入了protected以及static方法的Mock,暂时还不支持对于 private方法进行Mock,因为认为private方法本身不应该单独被拿出来做UnitTest,这里对这个问题暂时不展开讨论
开始配置
项目用的是Maven,如果是用Gradle的稍微变下格式就可以了,这里我用的是2.0.9版
<properties>
<powermock.version>2.0.9</powermock.version>
</properties>
其后开始添加会用到的依赖库
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.12.18</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.12.18</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule-agent</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
powermock-module-junit4-rule-agent/powermock-classloading-xstream这个两个库是用于集成测试的,然后其实我是想用JUnit5的,不过由于目前PowerMock只支持JUnit4,所以下部分注解必须使用JUnit4的库
-
@RunWith注解:在JUnit5中,@RunWith被@ExtendWith取代,所以这里我们只使用@RunWith,在集成测试中@RunWith需要搭配SpringJUnit4ClassRunner.class使用,即
@RunWith(SpringJUnit4ClassRunner.class)
-
@Test:只使用Junit4的注解,即
import org.junit.Test; //JUnit4
而非
import org.junit.jupiter.api.Test; //JUnit5
-
@Before以及@After:必须使用JUint4
import org.junit.After;
import org.junit.Before;
Assertions可以使用JUnit5的,我就直接使用了JUnit5的Assertions
下一文章我们会涉及到一些规范的内容