spock powermock使用总结

使用反射修改工具类里的final static 字段

单元测试遇到如下的代码块,因为jdk的值是从System.getProperty("java.version")里获取的,所以一直是1.8版本jdk

public class FieldHelper {

    private static final IFieldHelper fieldHelperInterface;

    static {
        String version = System.getProperty("java.version");
        if (version.contains("1.8.")) {
            fieldHelperInterface = new Jdk8FieldHelper();
        } else {
            fieldHelperInterface = new Jdk6or7FieldHelper();
        }
    }
}

这个时候使用反射把fieldHelperInterface字段修改掉即可

        Field field = FieldHelper.class.getDeclaredField("fieldHelperInterface")
        field.setAccessible(true)
        Field modifiersField = Field.class.getDeclaredField("modifiers")
        modifiersField.setAccessible(true)
        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL)
        FieldHelper.IFieldHelper fieldHelperInterface = new FieldHelper.Jdk6or7FieldHelper()
        field.set(null, fieldHelperInterface)

PowerMock mock static method

测试私有方法

使用powermockWhitebox.invokeMethod()方法可以调用对象的私有方法

//第一个参数为对象,第二个参数为该对象的私有方法名,后面的可变参数为传入的参数
        Whitebox.invokeMethod(demoRegisterService, "sendRegisterEvent", organizationDO, userDO, userDO, userDO)

如何mock在方法内创建的对象

有如下类,在method()方法里,创建了一个Animal对象,返回name

public class User {

    public String method (){
        Animal animal = new Animal("dog");
        return animal.getName();
    }
}

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

由于方法体内使用硬编码dog创建的用户,所以返回值是dog,如果我们想改变animal.getName()的返回值,可以使用PowerMockito.whenNew指定方法内新建对象的返回值。

//这里指定的类是
@PrepareForTest(User.class)
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
class GatewayHelperSpec extends Specification {


    def "test"() {
        given:
        def animal = Mock(Animal)
        PowerMockito.whenNew(Animal.class).withAnyArguments().thenReturn(animal)
        animal.getName() >> "cat"
        User user = new User()
      
        when:
        def result = user.getName()
        then:
        result=="cat"
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,924评论 1 14
  • 本文介绍了Android单元测试入门所需了解的内容,包括JUnit、Mockito和PowerMock的使用,怎样...
    于卫国阅读 10,079评论 0 5
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,124评论 0 4
  • 【原创文章,转载请注明原文章地址,谢谢!】 一、为什么要使用Mock工具 在做单元测试的时候,我们会发现我们要测试...
    叩丁狼教育阅读 19,559评论 3 25
  • 1 今晚外面的风好大 吹落了整个城市的坦荡和浮夸 流浪的人你为什么不回家 2 我是一座只有孤灯的空城 在等一个游荡...
    陈泽坤阅读 5,899评论 60 91

友情链接更多精彩内容