在Mockito中创建一个测试规则,例如“对于每个arg,该方法将返回基于此arg的答案”

时间:2013-04-16 21:14:11

标签: java mockito

有一堂课。

class A {

 public String getValue(String key) {
   return key;
 }

}

是否可以编写一个测试该方法的测试getValue()将一个键作为值返回。

有我的尝试:

  A aMock = mock(A.class);
  when(aMock.getValue("key")).thenReturn("key");

这很好,但这只适用于一个特定的参数值。但我可能需要某种规则,如"for each parameter it would return the parameter itself whatever value this parameter would have"


更多背景,我实际上要测试的内容:

假设我们有一个包含key=value个条目的文件,就像资源包一样。 如果找不到值,该方法将返回键。例如,如果我们通过“user.name”搜索,如果定义了“Bob”,我们就会拥有它。如果不是 - 它将返回key(user.name)itsef,因为我不希望此方法返回null

(这实际上是org.springframework.context.MessageSource.getMessage的模型 - 它的行为方式相似)

所以......更新了

public String getValue(String key) {
    // some code ...might be here, but we care about a result
    if (valueWasFound) {
     return theValue;
    } 
    return key;
}

2 个答案:

答案 0 :(得分:5)

使用returnsFirstArg中的AdditionalAnswers方法。

when(myMock.getValue(anyString())).then(returnsFirstArg());

答案 1 :(得分:2)

javadoc of Answer

中介绍了您要执行的操作
when(mock.someMethod(anyString())).thenAnswer(new Answer() {
    public Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        Object mock = invocation.getMock();
        return "called with arguments: " + args;
    }
});

// Following prints "called with arguments: foo"
System.out.println(mock.someMethod("foo"));