Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用mockito模拟带有对象参数的方法_Java_Unit Testing_Mockito - Fatal编程技术网

Java 使用mockito模拟带有对象参数的方法

Java 使用mockito模拟带有对象参数的方法,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有一个方法: public class Sender{ public Object send(Object param){ Object x; ..... return (x); } } 我想使用Mockito为这个方法编写一个单元测试,以便返回类型值基于参数的类类型。所以我这样做了: when(sender.send(Matchers.any(A.class))).thenReturn(value1); when(sender.send(Matchers.a

我有一个方法:

public class Sender{
  public Object send(Object param){
    Object x;
    .....
    return (x);
  }
}
我想使用Mockito为这个方法编写一个单元测试,以便返回类型值基于参数的类类型。所以我这样做了:

when(sender.send(Matchers.any(A.class))).thenReturn(value1);
when(sender.send(Matchers.any(B.class))).thenReturn(value2);
但无论参数类类型如何,返回值始终为值2。如何让它为A类类型参数返回值1,为B类类型参数返回值2

when(sender.send(Matchers.any(A.class))。然后返回(value1)

Mockito将尝试使用签名
send(参数)
,而不是
send(对象参数)
来模拟方法

您需要的是根据参数的类返回不同的值。你需要用答案来回答这个问题

Mockito.doAnswer(invocationOnMock -> {
    if(invocationOnMock.getArguments()[0].getClass() instanceof A) {
        return value1;
    }
    if(invocationOnMock.getArguments()[0].getClass() instanceof B) {
        return value2;
    }
    else {
        throw new IllegalArgumentException("unexpected type");
    }
}).when(mock).send(Mockito.anyObject());
有两种选择:

  • 不要使用
    any
    。使用测试中使用的
    A
    B
    实例

  • 使用
    Answer
    对象,该对象允许您指定要返回的内容


  • 正是我所想的,但懒得写:-)@noscreenname啊!你能把它转换成不使用lambda表达式吗?我理解其意图,但无法复制。@Sherlock123我可以,但如果您查找Mockito.doAnswer()文档,您也可以;)