我有一个简单的测试与模拟属性类:

@RunWith(MockitoJUnitRunner.class)
public class MockitoReturnListTest {
    @Mock
    Properties myProperties;
    
    @Test
    public void propertiesTest() {
        Set<String> propertyNames = myProperties.stringPropertyNames();
        System.out.println(propertyNames);
    }
}

我还没有创建任何为stringPropertyNames方法创建的数据库,但是当我调用它时,Mockito返回了一个空集.测试的输出是:

[]

如何指示Mockito为所有方法返回null而不是空集合?(实际上,我有一个更大的类,有许多List<> getSomething()方法,我希望返回null)

我知道我可以像这样stub方法:

    @Test
    public void propertiesTest2() {
        Set<String> propertyNames = myProperties.stringPropertyNames();
        when(myProperties.stringPropertyNames()).thenReturn(null);
        System.out.println(propertyNames);
    }

但是我想做一些自动的判断,让所有方法返回null是默认值.

推荐答案

编写自己的Answer类,覆盖answer方法,以始终返回null.它是一个函数接口,所以你可以使用lambda简洁地编写它.

然后,要将这个Answer类用于模拟类,请使用mock方法而不是@Mock注释:

Answer<Object> myAnswer = (invocation) -> null;
Properties myProperties = mock(Properties.class, myAnswer);

如果您希望这个答案成为所有模拟的默认值,请通过在CLASSPATH中创建一个名为org.mockito.configuration.MockitoConfiguration的类来更改默认Mockito配置(详细信息请参见doc).确保在org.mockito.configuration包中定义了它,并且它的名称是MockitoConfiguration.

MockitoConfiguration类中,重写getDefaultAnswer()方法以返回自己的Answer对象.

Java相关问答推荐

如何用javac编译Java类,即使对像java.lang.*这样的基本类也没有任何依赖关系?

使用ExecutorService时在ThreadFactory中触发自定义newThread函数

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

Character::Emoji不支持带数字的字符吗?

Java函数式编程中的双值单值映射

连接Quarkus中的两个异步操作

Jakarta CDI强制bean构造/注册遗留事件侦听器

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

如何将其他属性引用到log4j2 yaml配置中?

Spring Boot中的应用程序.properties文件中未使用的属性

是否有一个Java Future实现可以在池繁忙时在调用者线程中执行?

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

根据应用程序 Select 的语言检索数据

读取ConcurrentHashMap中的可变对象

Java 21保护模式的穷尽性

在JSON上获取反斜杠

Swagger.io OpenApi v3.0 声明默认媒体类型