本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2014/10/25/mockito-deep-stub-with-enum/
Mockito是一个测试常用的库,可以快速模拟对象。
加上对于Junit的支持不错,配有对应的Runner,使用起来也是相当方便。
一般使用
最常用的使用自然是SomeClass some=mock(SomeClass.class)
,如果你使用注解,还可以写成
@Mock
private SomeClass some;
如果这个类有这样的方法some.getObjectOne().getValue()
,我们是不能直接使用given或者when断言简单mock的,需要使用
ObjectOne one=mock(ObjectOne.class);
given(some.getObjectOne()).willReturn(one);
given(one.getValue()).willReturn("value");
Mockito提供了RETURNS_DEEP_STUBS模式,可以自己处理这种情况,如果我们使用SomeClass some=mock(SomeClass.class, RETURNS_DEEP_STUBS)
,我们就只需要一句简单的
given(some.getObjectOne().getValue()).willReturn("value");
就解决了。
对于Enum的处理
RETURNS_DEEP_STUBS本质上调用的ReturnsDeepStubs
类。
这个类在org.mockito.internal.stubbing.defaultanswers下面。
public Objectanswer(InvocationOnMock invocation)throws Throwable {
GenericMetadataSupport returnTypeGenericMetadata = actualParameterizedType(invocation.getMock()).resolveGenericReturnType(invocation.getMethod());
Class < ?>rawType = returnTypeGenericMetadata.rawType();
if (!mockitoCore().isTypeMockable(rawType)) {
return delegate().returnValueFor(rawType);
}
return deepStub(invocation, returnTypeGenericMetadata);
}
在方法中检测了该对象能否mock
publicbooleanisTypeMockable(Class < ?>type) {
return ! type.isPrimitive() && !Modifier.isFinal(type.getModifiers());
}
就是检查了一下基本的东西,比如是否final。
然后获取了对应类型的默认值。
然而对于Enum是没有默认值这种说法的,所以直接返回了null,这样的话直接使用类似
some.getObjectOne().getSomeEnum().getValue();
是会出现NPE的。
参考资料
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2014/10/25/mockito-deep-stub-with-enum/