我开始将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,有没有一种简单的方法可以改善Mockito自动返回Optional.absent()而不是null的问题?
解决方法:
我试图通过@Before注释方法中的反射来解决它,但是,我没有设法使其工作.
找到的解决方案可以通过创建自己的静态工厂来改进,该工厂使用OptionalAnswer创建模拟并使用它代替默认的Mockito工厂:
class MockitoOptional{
public static <T> T mock(Class<T> classToMock) {
return Mockito.mock(classToMock, new OptionalAnswer());
}
}
下一步将扩展一个测试运行程序,它将使用该工厂将模拟注入到@Mock注释字段中.如果您尚未听说自定义JUnit测试运行程序,请搜索它们.