1.接入pom
<!--测试包-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<!-- PowerMock -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.4.RELEASE</version>
<scope>test</scope>
</dependency>
2.新建单测类
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyList;
import static org.mockito.Matchers.anyString;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ 测试类1.class, 测试类2.class,... })
public class XXXTest {
}
3.mock静态类
PowerMockito.mockStatic(静态类.class);
PowerMockito.when(静态类.静态方法(参数)).thenReturn(mock对象);
4.mock方法中有新建对象的操作
PowerMockito.whenNew(新建类.class).withArguments(mock构造方法参数).thenReturn(mock新建类实例);
5.mock对外调用方法
PowerMockito.when(mock对外依赖类实例.依赖方法(自己构造的参数,anyString(), anyInt(), anyLong(),...)).thenReturn(理想值);
6.预初始化
@Before
public void before() {
MockitoAnnotations.initMocks(this);
spyClient = PowerMockito.mock(TransportClient.class);
}
踩到的坑:
1.在when里面设定带有参数的方法,且这个参数依赖于待测方法的入参,那么这两个参数必须是同一个对象,才能触发mock里面thenReturn()中的对象;
举例:
PowerMockito.mockStatic(IndexFactory.class);
PowerMockito.when(IndexFactory.getEsTransportClient(getClientNodes())).thenReturn(spyClient);
EsEasyClient easyClient = new EsEasyClient(getClientNodes());
public EsEasyClient(List<EsTransportClientNode> nodes) {
transportClient = IndexFactory.getEsTransportClient(nodes);
}
这个时候,拿到的transportClient就是null;
需要新建一个对象统一入参,才能获取到mock的spyClient;
List<EsTransportClientNode> nodes = getClientNodes();
PowerMockito.when(IndexFactory.getEsTransportClient(nodes)).thenReturn(spyClient);
EsEasyClient easyClient = new EsEasyClient(nodes);
public EsEasyClient(List<EsTransportClientNode> nodes) {
transportClient = IndexFactory.getEsTransportClient(nodes);
}