在第一部分中我们讲到Mockito使用cglib子类化来实现mocking,从而无法支持 mocking final 类型和方法。为了改变这种状况,Rafael Winterhalter在Mockito 2.1.0版本里创建了第二种 mock方法叫Inline mock maker。
Inline mock maker的奇妙之处在于它实现了Mockito对字节码产生的有效支持,这种支持通过类InlineByteBuddyMockMake
来实现
。
在
InlineByteBuddyMockMake
类中,定义了一个
Incubating
的
Annotation@Incubating
,这个注释的含义是说
InlineByteBuddyMockMake
是新创建的类,
M
ockito
开发者还在等待社区使用者的反馈信息. 不仅如此,这个新功能现在还是可选的.也就是说当前缺省情况下,功能是关闭的。为何如此呢,因为它基于完全不同的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>