gpt4 book ai didi

java - 如何测试从模拟依赖项返回对象,该依赖项接受模拟对象内的两个参数?

转载 作者:行者123 更新时间:2023-12-01 12:49:41 25 4
gpt4 key购买 nike

我找不到与我的问题相关的任何帖子。我正在使用 Mockito,我想测试 Controller 内的行为。我认为问题的核心是当我向模拟接口(interface)发送两个参数时我没有正确使用 Mockito。如果我只发送一个参数,效果很好。我不认为我也在使用 Spring 模拟 mvc 这一事实与此有任何关系。

我有一个接口(interface)MyService:

public MyObject doSomeDoggyStuff(long id, SomeOtherObject soo);

该接口(interface)的目的是执行操作并在成功时返回 MyObject。如果找不到该对象,则返回 null。

我有一个 Controller MyController:

@RestController
@RequestMapping(value = "/dogs")
public MyController
<snip>

@RequestMapping(method = RequestMethod.POST, value = "/{id}/toys/{toy}")
ResponseEntity<MyObject> doDoggyStuff(@PathVariable Long id, @RequestBody Toy toy) {
MyObject result = this.myService.doSomeDoggyStuff(id, toy);
if(result == null) {
return new ResponseEntity("errorinfo", HttpStatus.NOT_FOUND);
}
else {
return new ResponseEntity<MyObject>(result,HttpStatus.CREATED)'
}
}

我的测试类如下所示:

Public MyControllerTest <snip>

@Mock
private MyService myServiceMock;

@InjectMocks
private MyController myController;

测试方法的相关逻辑如下。

MyObject myObj = new MyObject();
Toy toy = new Toy();

when(myServiceMock.doSomeDoggyStuff(1, toy)).thenReturn(myObj);
mockMvc
.perform(
post("/dogs/{id}/toys/{toys}", 1, toy).contentType(
TestUtil.APPLICATION_JSON_UTF8).content(
TestUtil.convertObjectToJsonBytes(toy))).andExpect(status().isCreated())
.andReturn();

我遇到的问题是,我希望在这种情况下,当它测试 MyController 时,在线: MyObject result = this.myService.doSomeDoggyStuff(id, toy);

result 应该是我在 thenReturn 中设置的 myObj,但它始终设置为 null。我的服务中有其他方法只接受一个参数并且工作正常。当我使用 Mockito 发送两个参数时,我无法理解需要做什么不同的事情。

最佳答案

如果我正确理解您的要求,您应该像这样使用模拟:

when(myServiceMock.doSomeDoggyStuff(eq(1), any(Toy.class))).thenReturn(myObj);

按照您编写代码的方式,仅当使用您实例化它的 Toy 对象调用时,模拟才会返回 myObj ,而自从 Spring 实例化以来,这永远不会返回类(class)本身。该问题与参数数量无关。

但是,如果您想测试特定的 Toy 而不仅仅是它的任何实例,则需要添加 equals (并与规范保持一致) ,一个 hashCode) 方法,以便mockito可以匹配Toys。在没有任何 equals 方法的情况下,将检查引用,当然这些引用不相等,因为实例不相同。

关于java - 如何测试从模拟依赖项返回对象,该依赖项接受模拟对象内的两个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com