【发布时间】:2018-04-23 08:09:03
【问题描述】:
我会在使用 mockito 的 junit 测试时遇到问题。当我尝试验证服务时出现错误:“实际调用具有不同的参数”
型号:
@Entity
@Table(name = "projects")
public class Project {
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
@Column(name = "id_project")
private Long id;
@Column(name = "project_name")
private String name;
@JsonInclude(value = Include.NON_NULL)
@Column(name = "project_language")
private String language;
@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
@Column(name = "start_date")
private Date start_date;
@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
@Column(name = "end_date")
private Date end_date;
@Transient
@JsonIgnoreProperties
private Long id_user;
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "id_content_manager")
private User contentManager;
@Transient
private Long id_license;
@OneToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "id_license")
private License license;
@OneToMany
@LazyCollection(LazyCollectionOption.FALSE)
@NotFound(action = NotFoundAction.IGNORE)
@JoinTable(name = "team", joinColumns = { @JoinColumn(name = "id_project") }, inverseJoinColumns = { @JoinColumn(name = "id_user") })
private List<User> team;
@OneToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "id_policy")
private ProjectPolicy policy;
@OneToMany
@LazyCollection(LazyCollectionOption.FALSE)
@NotFound(action = NotFoundAction.IGNORE)
@JoinTable(name = "project2tag", joinColumns = { @JoinColumn(name = "id_project") }, inverseJoinColumns = { @JoinColumn(name = "id_tag") })
private List<Tag> tags = new ArrayList<Tag>();
...
控制器:
@RequestMapping(value = "/", method = RequestMethod.PUT, consumes = "application/json" , produces = "application/json")
public @ResponseBody ResponseEntity<BaseModel> edit( @RequestHeader(value="Authorization") String token, @RequestBody Project project, Locale locale) throws ParseException{
if(!SecurityUtil.validateToken(token)) {
return new ResponseEntity<BaseModel>(new BaseModel("error", MessageHandler.returnMessage("invalid_token", locale)), HttpStatus.UNAUTHORIZED);
}
if(project.getId() == null ) {
return new ResponseEntity<BaseModel>(new BaseModel("error", "Bad request"), HttpStatus.BAD_REQUEST);
}
Project projecttmp = projectDao.findById(project.getId());
if( projecttmp != null) {
project.setContentManager(projecttmp.getContentManager());
project.setLicense(projecttmp.getLicense());
project.setPolicy(projecttmp.getPolicy());
project.setTags(projecttmp.getTags());
project.setTeam(projecttmp.getTeam());
projectDao.editProject(project);
return new ResponseEntity<BaseModel>(new BaseModel("ok", "ok"), HttpStatus.OK);
}
return new ResponseEntity<BaseModel>(new BaseModel("error", MessageHandler.returnMessage("internal_error", locale)), HttpStatus.INTERNAL_SERVER_ERROR);
}
和失败的测试:
@Test
public void updateProject() throws Exception{
Project project = new Project();
project.setId(new Long(22));
when(projectService.findById(anyLong())).thenReturn(project);
String json = mapper.writeValueAsString(project);
logger.info(json);
doNothing().when(projectService).editProject(any(Project.class));
mockMvc.perform(put("/project/")
.header("Authorization", TOKEN)
.accept(MediaType.APPLICATION_JSON)
.content(json)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print());
verify(projectService, times(1)).findById(eq(project.getId()));
verify(projectService, times(1)).editProject(eq(project));
}
当我可以尝试运行测试时,结果是“实际调用有不同的参数” 有人可以帮助我吗?
【问题讨论】:
-
你能把完整的异常 stactrace 放进去吗?你知道你在哪一行得到这个异常吗?您是如何在测试类中初始化 projectService 的?
-
你能把测试用例类也放上去吗?你如何初始化
projectService?是来自春天的背景吗? -
@YogeshBadke 是 projectService 已初始化,也是因为所有其他测试都没有失败
标签: java hibernate spring-mvc junit mockito