java groovy + spock 单元测试实例 powermock mock静态方法 以及Flink单元测试实例

具体的介绍看这篇介绍的很全面。

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
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值