如何改善Guava Optional的mockito默认行为?

时间:2014-03-21 09:11:25

标签: java design-patterns null mockito guava

我开始使用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

3 个答案:

答案 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()来电。是的,它应该是在这一时期的那一方。