我开始使用Guava Optional作为null object pattern的一部分,并希望改进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.absent()
,是否有一种简单的方法可以改善mockito自动返回null
而不是Optional
?
答案 0 :(得分:2)
我第一次使用linked answer获得字符串。
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());
}
不会变得容易,对吧?
答案 1 :(得分:2)
我试图用@Before
注释方法中的反射来解决它,但是,我没有设法让它工作。
您发现的解决方案可以通过创建自己的静态工厂来改进,该工厂使用OptionalAnswer
创建模拟并使用它而不是默认的Mockito工厂:
class MockitoOptional{
public static <T> T mock(Class<T> classToMock) {
return Mockito.mock(classToMock, new OptionalAnswer());
}
}
下一步将扩展将使用此工厂的测试运行器将模拟注入@Mock
带注释的字段。如果您还没有听说过它们,请搜索自定义的JUnit测试跑步者。
答案 2 :(得分:-1)
Mockito.when(underTest.get()).thenReturn(Optional.<Object>absent());
这就是你需要做的。将underTest.get()
返回的类型添加到您的absent()
来电。是的,它应该是在这一时期的那一方。