简体   繁体   English

Mockito验证调用错误

[英]Mockito verify invocation error

I would have a problem with the junit tests with mockito. 我将对带有嘲笑的junit测试有问题。 when I try to verify a service I get the error: "Actual invocation has different arguments" 当我尝试验证服务时收到错误消息:“实际调用具有不同的参数”

Model: 模型:

@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>();
...

Controller: 控制器:

@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);
    }

and the test with failure: 和失败的测试:

@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));
    }

When i can try to run the test the result is "Actual invocation has different arguments" someone who can help me? 当我可以尝试运行测试时,结果是“实际调用具有不同的论点”,有人可以帮助我吗?

Mockito.eq() compares using .equals() method. Mockito.eq()使用.equals()方法进行比较。 You should override this method (and hashCode as well) in Project class, and make comparison by id. 您应该在Project类中重写此方法(以及hashCode),并按ID进行比较。 For example: 例如:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Project project = (Project) o;

    return getId() != null ? getId().equals(project.getId()) : project.getId() == null;
}

@Override
public int hashCode() {
    return getId() != null ? getId().hashCode() : 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM