Java 莫基托:如何模仿二传手的二传手?

Java 莫基托:如何模仿二传手的二传手?,java,mockito,Java,Mockito,假设我有这样一个代码: public response MyMethod(Request req) { String id = req.getFirst().geId(); } 我模拟了主对象req:Request-reqMock=mock(Request.class) 然后我做了一些类似的事情: First first = new First(); first.setId("1") req.setFirst(first); 我如何继续模仿成员,即getFirst()然后geId()

假设我有这样一个代码:

public response MyMethod(Request req)
{
    String id = req.getFirst().geId();
}
我模拟了主对象req
Request-reqMock=mock(Request.class)

然后我做了一些类似的事情:

First first = new First();
first.setId("1")
req.setFirst(first);
我如何继续模仿成员,即
getFirst()
然后
geId()


感谢您的帮助

您可以侦听事件(获取名称)并覆盖返回值。例如:

private final First first = mock(First.class);

when(first.getFirst()).thenReturn("some_value");

您可以侦听事件(获取名称)并覆盖返回值。例如:

private final First first = mock(First.class);

when(first.getFirst()).thenReturn("some_value");

您不应该模拟方法输入。如果你想单元测试你的方法。您必须使用实际值调用该方法,否则您将无法真正测试其行为

您不应模拟该方法的输入。如果你想单元测试你的方法。您必须使用实际值调用该方法,否则您将无法真正测试他的行为

您希望首先模拟,并让getFirst返回mockFirst。看

一旦有了它,就可以在(mockFirst.geId())时存根,然后返回(“someString”)


就我个人而言,我会跳过deepstubs功能,按照Ole在评论中所说的做,让getFirst先返回mockFirst。看

一旦有了它,就可以在(mockFirst.geId())时存根,然后返回(“someString”)


就我个人而言,我会跳过deepstubs功能,按照Ole在评论中所说的去做

看来嵌套的get比嵌套的set更重要。您可以通过执行以下操作来处理此问题:

Contents mockContents = Mockito.mock(Contents.class);
Mockito.when(mockContents.geId()).thenReturn("string you want to return");

Response mockResponse = Mockito.mock(Response.class);
Mockito.when(mockResponse.getFirst()).thenReturn(mockContents);

您可以根据需要将这些链接在一起,只要确保每次返回都返回模拟版本即可

看来嵌套的get比嵌套的set更重要。您可以通过执行以下操作来处理此问题:

Contents mockContents = Mockito.mock(Contents.class);
Mockito.when(mockContents.geId()).thenReturn("string you want to return");

Response mockResponse = Mockito.mock(Response.class);
Mockito.when(mockResponse.getFirst()).thenReturn(mockContents);

您可以根据需要将这些链接在一起,只要确保每次返回都返回模拟版本即可

那么
gitId()
呢?进一步说,如果层次结构中有更多的内容,我会感到困惑,因为你把
一些值
放在双引号中。我猜你的意思是任何期望的合适值。是的,没错。when()的返回类型必须与方法调用的返回类型匹配。gitId()的返回类型如何?进一步说,如果层次结构中有更多的内容,我会感到困惑,因为你把
一些值
放在双引号中。我猜你的意思是任何期望的合适值。是的,没错。when()的返回类型必须与方法调用的返回类型匹配。实际上,
Id
不是该方法的响应,而是输入。所以你的意思是我不需要先模拟
id
?我指的是输入。我修改了我的回答实际上,
Id
不是这个方法的响应,而是输入。所以你的意思是我不需要先模拟
id
?我指的是输入。我修改了我的回答,而不是
req.setFirst(first)
(因为
req
是一个模拟,所以它不会做任何事情),你必须这样做
Mockito.when(req.getFirst())。然后返回(first)
,而不是
req.setFirst(first)
(因为
req
是一个模拟,所以它不会做任何事情)您必须执行此操作
Mockito.when(req.getFirst())。然后返回(first)