java - 如何使用 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;
}
}
如何正确模拟它?提前致谢。
解决方案
如果默认情况下equals
在类中未覆盖该方法,则使用比较传递给的方法。在您的情况下,两个对象属性具有相同的值,但它们仍然是不同的对象。所以要么覆盖方法,要么使用EmailParams
Mockito
Object.equals
EmailParams
getEmailByFilter
equals
EmailParams
ArgumentMatchers.argThat
when(emailServiceMock.getEmailByFilter(ArgumentMatchers.argThat(p -> p.getPEmail().equals("test@gmail.com") && condition2 && condition3 )))
.thenReturn(emailsList);
推荐阅读
- java - SpringBoot:如何从返回 ResponseEntity 的微服务下载文件
? - notepad++ - 如何将 XQuery 语法突出显示添加到 NotePad++ (NPP) 7.x?
- apache-kafka - 是否可以使用 MirrorMaker2 复制没有别名前缀的 kafka 主题
- excel - 在excel中查找两列的组合,一列中有一个条件
- css - Bootstrap 4:小浮动图标菜单
- c# - Unity - 将不同的游戏对象放入函数 OntriggerEnter
- python - 如何将时间用作带有seaborn的散点图的x轴?
- javascript - 尝试从获取响应中访问 JSON 数组中的元素时出现未定义错误
- c - C:如何将 int 类型变量发送到 char 数组?
- java - 同时将控制台输出写入文件和控制台