[英]How to improve mockito default behaviour for Guava Optional?
我开始使用Guava Optional作为null对象模式的一部分,并希望改进Mockito中的使用,其中null
是模拟对象的默认返回值。 为了正确行事,需要明确告诉Mockito使用Optional.absent()
代替:
import org.mockito.*;
import org.testng.*;
import org.testng.annotations.*;
import com.google.common.base.Optional;
public class Example {
@Mock
private MyObject underTest;
@Test
public void testExample() {
// fails
// assertNotNull(underTest.get());
Mockito.when(underTest.get()).thenReturn(Optional.absent());
Assert.assertNotNull(underTest.get());
}
public class MyObject {
public Optional<Object> get() {
return Optional.absent();
}
}
@BeforeClass
public void beforeClass() {
MockitoAnnotations.initMocks(this);
}
}
如果实际类型是Optional
有没有一种简单的方法来改进mockito以自动返回Optional.absent()
而不是null
?
我得到了第一个关于字符串链接答案的镜头。
public class OptionalAnswer extends ReturnsEmptyValues {
@Override
public Object answer(InvocationOnMock invocation) {
Object answer = super.answer(invocation);
if (answer != null) {
return answer;
}
Class<?> returnType = invocation.getMethod().getReturnType();
if (returnType == Optional.class) {
return Optional.absent();
}
return null;
}
}
@Test
public void testExample() {
MyObject test = mock(MyObject.class, new OptionalAnswer());
Assert.assertNotNull(test.get());
}
会不会变得容易,对吧?
我尝试用@Before
注释方法中的反射解决它,但是,我没有设法让它工作。
您发现的解决方案可以通过创建自己的静态工厂来改进,该工厂使用OptionalAnswer
创建模拟并使用它而不是默认的Mockito工厂:
class MockitoOptional{
public static <T> T mock(Class<T> classToMock) {
return Mockito.mock(classToMock, new OptionalAnswer());
}
}
下一步将扩展将使用此工厂的测试运行器将模拟注入@Mock
注释字段。 如果您还没有听说过它们,请搜索自定义JUnit测试运行器。
Mockito.when(underTest.get()).thenReturn(Optional.<Object>absent());
这就是你需要做的。 将underTest.get()
返回的类型添加到absent()
调用中。 是的,它应该是在这一时期的那一方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.