spock powermock使用總結(jié)

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

單元測(cè)試遇到如下的代碼塊,因?yàn)閖dk的值是從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();
        }
    }
}

這個(gè)時(shí)候使用反射把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

測(cè)試私有方法

使用powermockWhitebox.invokeMethod()方法可以調(diào)用對(duì)象的私有方法

//第一個(gè)參數(shù)為對(duì)象,第二個(gè)參數(shù)為該對(duì)象的私有方法名,后面的可變參數(shù)為傳入的參數(shù)
        Whitebox.invokeMethod(demoRegisterService, "sendRegisterEvent", organizationDO, userDO, userDO, userDO)

如何mock在方法內(nèi)創(chuàng)建的對(duì)象

有如下類,在method()方法里,創(chuàng)建了一個(gè)Animal對(duì)象,返回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;
    }
}

由于方法體內(nèi)使用硬編碼dog創(chuàng)建的用戶,所以返回值是dog,如果我們想改變animal.getName()的返回值,可以使用PowerMockito.whenNew指定方法內(nèi)新建對(duì)象的返回值。

//這里指定的類是
@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"
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對(duì)應(yīng)的棧就會(huì)被回收,此時(shí),在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,585評(píng)論 1 14
  • 本文介紹了Android單元測(cè)試入門所需了解的內(nèi)容,包括JUnit、Mockito和PowerMock的使用,怎樣...
    于衛(wèi)國(guó)閱讀 4,722評(píng)論 0 5
  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,576評(píng)論 0 4
  • 【原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文章地址,謝謝!】 一、為什么要使用Mock工具 在做單元測(cè)試的時(shí)候,我們會(huì)發(fā)現(xiàn)我們要測(cè)試...
    叩丁狼教育閱讀 19,664評(píng)論 3 25
  • 1 今晚外面的風(fēng)好大 吹落了整個(gè)城市的坦蕩和浮夸 流浪的人你為什么不回家 2 我是一座只有孤燈的空城 在等一個(gè)游蕩...
    陳澤坤閱讀 1,980評(píng)論 60 91

友情鏈接更多精彩內(nèi)容