我无法找到与我的问题相关的任何帖子。我正在使用Mockito,我想测试控制器内的行为。我认为问题的核心是当我向模拟接口发送两个参数时,我没有正确使用Mockito。如果我只发送一个参数,它工作正常。我不认为我也使用Spring模拟mvc的事实与此有关。
我有一个界面MyService
:
public MyObject doSomeDoggyStuff(long id, SomeOtherObject soo);
接口的目的是做事情并在成功时返回MyObject。如果它找不到对象,则只返回null。
我有一个控制器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);
结果应该是我在thenReturn中设置的myObj,但它始终设置为null。我的服务中有其他方法只接受一个参数,它工作正常。当我使用Mockito发送两个论点时,我无法掌握我需要做的事情。
答案 0 :(得分:1)
如果我正确理解您的要求,您应该使用这样的模拟:
when(myServiceMock.doSomeDoggyStuff(eq(1), any(Toy.class))).thenReturn(myObj);
你编写代码的方式,只有在用你实例化的myObj
对象调用时,mock才会返回Toy
,这是因为Spring将自己实例化类。这个问题与参数的数量没有任何关系。
但是,如果您要测试特定的Toy
而不仅仅是其中的任何实例,则需要添加equals
(并且要符合规范,{{1} })方法所以mockito可以匹配玩具。在没有任何equals方法的情况下,会检查引用,并且这些引用不相等,因为实例不相同。
答案 1 :(得分:0)
您需要在玩具中实现equals或使用ArgumentCaptor检查传递的对象的详细信息。否则(就像geoand已经设法提到的那样)你比较参考文献。