繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM