首页 > 解决方案 > 如何使用 Mockito 模拟构造函数对象属性?

问题描述

我试图在我的测试类中模拟一个构造函数“EmailParams”。模拟失败,因为构造函数 EmailParams 模拟为空。

下面是我的测试方法

@Test
   public void getContactEmailsByFilterSuccessTest() throws Exception {

    String contactId = "752";
    String emailAddress = "test@gmail.com";
    String emailType = "EW";

    MockHttpServletRequest request = new MockHttpServletRequest();
    when(helper.isNumeric(any(String.class))).thenReturn(true);

    List<ContactXref> sourcedContacts = getContactXrefs();
    when(contactXrefServiceMock.getContactsForId(contactId)).thenReturn(sourcedContacts);

    EmailParams emailParams = new EmailParams("test@gmail.com", "EW", sourcedContacts.get(0).getContact().getContactId().toString());

    List<Email> emailsList = getEmailsList();
    when(emailServiceMock.getEmailByFilter(emailParams)).thenReturn(emailsList);

    ResponseEntity<List<Email>> response = contactControllerMock.getContactEmailsByFilter(request, contactId, emailAddress, emailType);
    Assert.assertEquals("getContactEmailsByFilterSuccessTest: Expected response code to be 200", "200", 
  response.getStatusCode().toString());   
 }

这是我试图模拟的方法。尝试模拟构造函数时测试失败

@GetMapping(value = "/{contactId}/" + UrlMapping.EMAILS, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<Email>> getContactEmailsByFilter(HttpServletRequest request,
                                                            @PathVariable(name = RequestParams.CONTACTID) String contacId,
                                                            @RequestParam(required = false, name = RequestParams.EMAILADDRESS) String emailAddress,
                                                            @RequestParam(required = false, name = RequestParams.EMAILTYPE) String emailType)
                                                            throws Exception {


      ResponseEntity response = new ResponseEntity("Only numeric contactId is allowed", HttpStatus.BAD_REQUEST);

      List<Email> emailList;
      List<ContactXref> sourcedContacts;

      if (helper.isNumeric(contactId)) {

          sourcedContacts = contXrefService.getContactsForId(contactId);

          EmailParams params = new EmailParams(emailAddress, emailType, sourcedContacts.get(0).getContact().getContactId().toString());

          emailList = emailService.getEmailByFilter(params);
          if (emailList != null) {
               response = emailList.size() == 0 ? new ResponseEntity("No emails were found for the request", HttpStatus.NOT_FOUND) : new ResponseEntity(emailList, new HttpHeaders(), HttpStatus.OK);
           } else {
              response = new ResponseEntity("Encountered exception in retrieving emails", HttpStatus.INTERNAL_SERVER_ERROR);
          }
      }
       return response;
}

这是我的类,它有构造函数。

public class EmailParams {

    String email;
    String emailType;
    String ptyId;

    public EmailParams() {
        super();
    }

    public EmailParams(String pEmail, String pEmailType, String pPtyId) {
        email = pEmail;
        emailType = pEmailType;
        ptyId = pPtyId;
    }
}

如何正确模拟它?提前致谢。

标签: javamockito

解决方案


如果默认情况下equals在类中未覆盖该方法,则使用比较传递给的方法。在您的情况下,两个对象属性具有相同的值,但它们仍然是不同的对象。所以要么覆盖方法,要么使用EmailParamsMockitoObject.equalsEmailParamsgetEmailByFilterequalsEmailParamsArgumentMatchers.argThat

 when(emailServiceMock.getEmailByFilter(ArgumentMatchers.argThat(p -> p.getPEmail().equals("test@gmail.com") && condition2 && condition3 )))
                  .thenReturn(emailsList);

推荐阅读