Mockito中RETURNS_DEEP_STUBS对于enum的处理

25 10月

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: 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的。

参考资料

ISSUE-207

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载自夜明的孤行灯

本文链接地址: https://www.huangyunkun.com/2014/10/25/mockito-deep-stub-with-enum/

发表评论

电子邮件地址不会被公开。