Mockito對final類型和方法的支持(二):為什么在版本2.1之后支持final類型和方法及使用限制


       在第一部分中我們講到Mockito使用cglib子類化來實現mocking,從而無法支持 mocking final 類型和方法。為了改變這種狀況,Rafael Winterhalter在Mockito 2.1.0版本里創建了第二種 mock方法Inline mock maker。

       Inline mock maker的奇妙之處在於它實現了Mockito對字節碼產生的有效支持,這種支持通過類InlineByteBuddyMockMake來實現InlineByteBuddyMockMake類中,定義了一個 IncubatingAnnotation@Incubating,這個注釋的含義是說InlineByteBuddyMockMake是新創建的類,Mockito開發者還在等待社區使用者的反饋信息. 不僅如此,這個新功能現在還是可選的.也就是說當前缺省情況下,功能是關閉的。為何如此呢,因為它基於完全不同的mocking機制,需要使用者更多的反饋.我們想要使用它來Mocking final 類型和方法時,可以通過 mockito extension mechanism來激活它。具體操作只有在配置文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker里加入mock-maker-inline這個值作為一行就可以了:

 

mock-maker-inline

 

當激活mock maker inline之后,我們可以測試如下的例子:

public final class Need {
    public final int getNeed() {
        return 4;
    }
}

 測試類:

import org.junit.Test;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.junit.Assert.*;

public class NeedTest {
    @Test
    public void testNeed() throws Exception {
        Need need=mock(Need.class);
        when(need.getNeed()).thenReturn(4);
    }
}

 POM的依賴性,注意版本要對應:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.2.0-beta.1</version>
</dependency>
 
<!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>1.4.26</version>
</dependency>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM