具体的介绍看这篇介绍的很全面。
https://blog.csdn.net/u012129558/article/details/78677357
powermock mock静态方法实例
1、pom依赖引入
引入spock、groovy、powermock 相关依赖以及maven插件
<!-- 代码检查使用的依赖 -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.5</version>
<type>maven-plugin</type>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.3-groovy-2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.6</version>
</dependency>
<dependency>
<groupId>com.blogspot.toomuchcoding</groupId>
<artifactId>spock-subjects-collaborators-extension</artifactId>
<version>1.2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.9</version>
<scope>test</scope>
</dependency>
<plugin>
<!-- The gmavenplus plugin is used to compile Groovy code. To learn more about this plugin,
visit https://github.com/groovy/GMavenPlus/wiki -->
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.6</version>
<configuration>
<testSources>
<testSource>
<directory>${basedir}/src/test/groovy</directory>
<includes>
<include>**/*.groovy</include>
</includes>
</testSource>
</testSources>
</configuration>
<executions>
<execution>
<goals>
<goal>addTestSources</goal>
<goal>compile</goal>
<goal>compileTests</goal>
</goals>
</execution>
</executions>
</plugin>
2、被测试代码中用到了redis的实例
package project;
import source.RedisUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.stream.Collectors;
/**
* 围栏报警辅助工具
* @author ***
* @date 2021/4/15 14:46
*/
public class FenceAlarmUtils {
private static final Logger logger = LoggerFactory.getLogger(FenceAlarmUtils.class);
private static final String ZERO = "0";
/**
* 查找其他省份的行政区域编码 认为长度为2的是省份行政区域编码
*/
public static List<String> getOtherProvinceFences(String fenceId) {
try {
List<String> fences = RedisUtils.getKeys(RedisUtils.getFenceIndex());
String nowProFence = fenceId.substring(0, 2);
//过滤本身 过滤长度大于2
return fences.stream().filter(item -> item.length() == 2 && !item.equals(nowProFence)).collect(Collectors.toList());
} catch (Exception e) {
logger.warn(e.getMessage());
}
return null;
}
/**
* 查找其他省份的行政区域编码 认为长度为2的是省份行政区域编码(不过滤原围栏)
*/
public static List<String> getOtherProvinceFences() {
try {
List<String> fences = RedisUtils.getKeys(RedisUtils.getFenceIndex());
//过滤长度大于2
return fences.stream().filter(item -> item.length() == 2).collect(Collectors.toList());
} catch (Exception e) {
logger.warn(e.getMessage());
}
return null;
}
/**
* 获取父级围栏编号
*/
public static String getParentFenceId(String fenceId) {
try {
String parentFenceId = RedisUtils.hget(RedisUtils.getFenceIndex(), fenceId, RedisUtils.getParentFenceFieldName(), String.class);
if (parentFenceId==null || parentFenceId.equalsIgnoreCase(ZERO)){
return null;
}
return parentFenceId;
} catch (Exception e) {
logger.warn("fenceId: {} getParentFenceId error msg: {}.", fenceId, e.getMessage());
}
return null;
}
/**
* 获取子围栏列表
*/
public static List<String> getChildFences(String fenceId) {
try {
return RedisUtils.hget(RedisUtils.getFenceIndex(), fenceId, RedisUtils.getChildFenceFieldName(), List.class);
} catch (Exception e) {
logger.warn("fenceId: {} getChildFences error msg: {}.", fenceId, e.getMessage());
}
return null;
}
}
3、单元测试类:
首先是目录结构:
代码使用:具体使用方法建议百度powermock的使用
Powermock 常用操作
https://blog.csdn.net/j16421881/article/details/78511058
package com.project.test.SpockFenceAlarmUtilsSpecification.groovy
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import project.FenceAlarmUtils
import source.RedisUtils
import spock.lang.Specification
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([RedisUtils.class])
class FenceAlarmUtilsSpec extends Specification{
void setup(){
PowerMockito.mockStatic(RedisUtils.class)
FenceAlarmUtils fenceAlarmUtils = new FenceAlarmUtils()
}
def "testGetOtherProvinceFences"(){
given:
List list = new ArrayList()
list.add("23")
list.add("22")
list.add("121")
and:
PowerMockito.when(RedisUtils.getKeys(Mockito.any())).thenReturn(list)
when:
List res = FenceAlarmUtils.getOtherProvinceFences()
then:
List resLis = new ArrayList()
resLis.add("23")
resLis.add("22")
res == resLis
}
def "testGetOtherProvinceFencesReturnNull"(){
given:
String list = null
and:
PowerMockito.when(RedisUtils.getKeys(Mockito.any())).thenReturn(list)
when:
List res = FenceAlarmUtils.getOtherProvinceFences()
then:
List resLis = null
res == resLis
}
def "testGetOtherProvinceFencesWithPar"(){
given:
List list = new ArrayList()
list.add("23")
list.add("22")
list.add("121")
and:
PowerMockito.when(RedisUtils.getKeys(Mockito.any())).thenReturn(list)
when:
List res = FenceAlarmUtils.getOtherProvinceFences("22")
then:
List resLis = new ArrayList()
resLis.add("23")
res == resLis
}
def "testGetOtherProvinceFencesWithParReturnNull"(){
given:
List list = null
and:
PowerMockito.when(RedisUtils.getKeys(Mockito.any())).thenReturn(list)
when:
List res = FenceAlarmUtils.getOtherProvinceFences("22")
then:
List resLis = null
res == resLis
}
def "testGetParentFenceId"(){
given:
PowerMockito.when(RedisUtils.hget(Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any())).thenReturn("23")
expect:
FenceAlarmUtils.getParentFenceId() == "23"
}
def "testGetParentFenceIdReturnNull"(){
given:
PowerMockito.when(RedisUtils.hget(Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any())).thenReturn(null)
expect:
FenceAlarmUtils.getParentFenceId() == null
}
def "testGetChildFences"(){
given:
List list = new ArrayList()
list.add("23")
PowerMockito.when(RedisUtils.hget(Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any())).thenReturn(list)
expect:
FenceAlarmUtils.getChildFences("23")==list
PowerMockito.mockStatic(RedisUtils.class)
PowerMockito.when(RedisUtils.exists(Mockito.any(), Mockito.any())).thenReturn(true)
when:
Boolean a = RedisUtils.exists(1, "help")
then:
a == true
//RedisUtils.getKeys(1) == list
}
}
4、spock groovy 与 flink
要测试的flink代码(红线是要mock的对象)
mock:
package com.project.test.SpockCalcFenceFunctionSpecification.groovy
import beans.CanInfo
import org.apache.flink.api.common.functions.util.ListCollector
import org.apache.flink.api.common.state.MapState
import org.apache.flink.api.java.tuple.Tuple
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction
import org.apache.flink.util.Collector
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import project.CalcFenceFunction
import org.apache.flink.api.java.tuple.Tuple1
import project.CalcFenceUtils
import spock.lang.Specification
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([CalcFenceUtils.class])
class CalcFenceFunctionSpec extends Specification{
void setup(){
PowerMockito.mockStatic(CalcFenceUtils.class)
}
def "testCalcFenceFunction"(){
given:
CalcFenceFunction calcFenceFunction = new CalcFenceFunction()
//模拟状态
MapState<String, Object> fenceState = new MapState<String, Object>() {
@Override
Object get(String key) throws Exception {
return null
}
@Override
void put(String key, Object value) throws Exception {
}
@Override
void putAll(Map<String, Object> map) throws Exception {
}
@Override
void remove(String key) throws Exception {
}
@Override
boolean contains(String key) throws Exception {
return false
}
@Override
Iterable<Map.Entry<String, Object>> entries() throws Exception {
return null
}
@Override
Iterable<String> keys() throws Exception {
return null
}
@Override
Iterable<Object> values() throws Exception {
return null
}
@Override
Iterator<Map.Entry<String, Object>> iterator() throws Exception {
return null
}
@Override
boolean isEmpty() throws Exception {
return false
}
@Override
void clear() {
}
}
fenceState.put("lastFence","a")
fenceState.put("firstOutTime", 1600000000)
//添加状态
calcFenceFunction.fenceState = fenceState
//模拟Tuple
Tuple tuple = new Tuple1<>()
CanInfo canInfo = new CanInfo("123",2.0,2.0,1600000000,false,"1")
//模拟Iterable
Iterable<CanInfo> iterable = new ArrayList<>()
iterable.add(canInfo)
//模拟collector输出
Collector<String> collector = new ListCollector<>()
ProcessWindowFunction.Context context
tuple.f0="123"
calcFenceFunction.process(tuple, context, iterable, collector)
List list = new ArrayList()
list.add("a")
and:
PowerMockito.when(CalcFenceUtils.getFenceListFromRedis(Mockito.any())).thenReturn(list)
PowerMockito.when(CalcFenceUtils.isInFence(Mockito.anyDouble(),Mockito.anyDouble(),Mockito.any())).thenReturn(0)
Void v
CalcFenceUtils.checkExistsWithUpdateFenceMap(_) >> v
expect:
1 == 1
}
def "testClose"(){
given:
CalcFenceFunction calcFenceFunction = new CalcFenceFunction()
calcFenceFunction.close()
expect:
1==1
}
}