test如何从模拟的依赖项中返回对象,该依赖项在模拟对象中接受两个参数?

时间:2014-06-20 13:54:07

标签: java unit-testing mockito mockmvc

我无法找到与我的问题相关的任何帖子。我正在使用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发送两个论点时,我无法掌握我需要做的事情。

2 个答案:

答案 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已经设法提到的那样)你比较参考文献。