如何处理 Mockito 中不匹配的参数?

2022-09-01 15:43:11

我喜欢做这样的事情:

.when( 
    myMock.doSomething(
        Matchers.eq( "1" )
    ) 
)
.thenReturn( "1" )
.othwerwise()
.thenThrow( new IllegalArgumentException() );

当然,方法并不存在,而只是为了向你展示我想要完成的任务。otherwise()


答案 1

(轻微的免责声明,我个人从未这样做过,只是在javadoc中阅读了它)...如果 mock 接口上的所有方法都可以使用相同的默认行为,则可以按如下方式在 mock 上设置默认答案

Foo myMock = Mockito.mock(Foo.class,new ThrowsExceptionClass(IllegalArgumentException.class));
Mockito.when(myMock.doSomething(Matchers.eq("1"))).thenReturn("1");

JavaDoc Links for: Mockito#mock and ThrowsExceptionClass

或者,正如 Stubbing 教程中所讨论的,stubbing 的顺序很重要,最后匹配获胜,因此您也可以执行以下操作:

Foo myMock = Mockito.mock(Foo.class);
Mockito.when(myMock.doSomething(Matchers.any(String.class))).thenThrow(IllegalArgumentException.class);
Mockito.when(myMock.doSomething(Matchers.eq("1"))).thenReturn("1");

答案 2

您可以创建自己的Answer实现,该实现将注意被调用的参数:

myMock.doSomething(Mockito.any(String.class)).thenAnswer( myAnswer );

所述答案的实现可以执行如下操作:

public String answer(InvocationOnMock invocation) {
    if ("1".equals(invocation.getArguments()[0])) {
       return "1";
    }
    else {
       throw new IllegalArgumentException();
    }
} 

推荐