Unit testing Mockito java.lang.ClassCastException:my.custom.class.Project无法转换为java.lang.Boolean

Unit testing Mockito java.lang.ClassCastException:my.custom.class.Project无法转换为java.lang.Boolean,unit-testing,junit,mocking,mockito,Unit Testing,Junit,Mocking,Mockito,我有一个试图模拟的数据库访问对象。使用mock的代码调用public void refresh(Project)方法。我需要操纵参数并插入一个'id' 错误: SEVERE - EjbTransactionUtil.handleSystemException: websphere.jaxrs.entities.Project cannot be cast to java.lang.Boolean java.lang.ClassCastException: websphere.jaxrs.enti

我有一个试图模拟的数据库访问对象。使用mock的代码调用
public void refresh(Project)
方法。我需要操纵参数并插入一个'id'

错误:

SEVERE - EjbTransactionUtil.handleSystemException: websphere.jaxrs.entities.Project cannot be cast to java.lang.Boolean
java.lang.ClassCastException: websphere.jaxrs.entities.Project cannot be cast to java.lang.Boolean
    at websphere.jaxrs.daos.interfaces.ProjectDAO$$EnhancerByMockitoWithCGLIB$$cf2a39e4.insert(<generated>)
    at websphere.jaxrs.service.ProjectREST.postProject(ProjectREST.java:105)
SEVERE-EjbTransactionUtil.handleSystemException:websphere.jaxrs.entities.Project不能强制转换为java.lang.Boolean
java.lang.ClassCastException:websphere.jaxrs.entities.Project不能转换为java.lang.Boolean
位于websphere.jaxrs.daos.interfaces.ProjectDAO$$EnhancerByMockitoWithCGLIB$$cf2a39e4.insert()
位于websphere.jaxrs.service.ProjectREST.postProject(ProjectREST.java:105)
测试:

@Test
public void postProject_ValidRequest_NoContent() {
    projectRest = (ProjectREST) container.getContext().lookup("java:global/ProjectREST");
    projectDAOm = mock(ProjectDAO.class, Mockito.RETURNS_DEFAULTS);
    userDAOm = mock(UserDAO.class);
    apiDAOm = mock(ApiDAO.class);
    apikeyGeneratorm = mock(ApikeyGenerator.class);
    projectRest.setDAO(projectDAOm, ProjectDAO.class); //override the real implementation
    projectRest.setDAO(userDAOm, UserDAO.class);
    projectRest.setDAO(apiDAOm, ApiDAO.class);
    projectRest.setDAO(apikeyGeneratorm, ApikeyGenerator.class);
    Integer keyLength = 40;
    when(projectDAOm.insert((Project) anyObject())).thenAnswer(new Answer<Project>() {
        @Override
        public Project answer(InvocationOnMock invocation) throws Throwable {
            Project project = (Project) invocation.getArguments()[0];
            project.setProjectid(10000);
            project.setCollaborators(new ArrayList<Collaborator>());
            project.setActiveapis(new ArrayList<Api>());
            return project;
        }
    });

    Map<String, Object> projectSettings = new HashMap<String, Object>();
    projectSettings.put("projectname", "Hello World");
    Response response = projectRest.postProject("user", projectSettings);

    assertEquals(204, response.getStatus());
    verify(projectDAOm, atLeastOnce()).insert(new Project());
    verify(apikeyGeneratorm, times(1)).generateKey(anyInt(), keyLength);
}
@测试
公共无效项目后有效请求内容(){
projectRest=(projectRest)container.getContext().lookup(“java:global/projectRest”);
projectDAOm=mock(ProjectDAO.class,Mockito.RETURNS\u DEFAULTS);
userDAOm=mock(UserDAO.class);
apiDAOm=mock(ApiDAO.class);
ApikeyGenerator=mock(ApikeyGenerator.class);
setDAO(projectDAOm,ProjectDAO.class);//重写实际实现
setDAO(userDAOm,UserDAO.class);
projectRest.setDAO(apiDAOm,ApiDAO.class);
setDAO(ApikeyGenerator,ApikeyGenerator.class);
整数键长=40;
当(projectDAOm.insert((Project)anyObject())。然后回答(new Answer()){
@凌驾
公共项目应答(invocationMock调用)抛出可丢弃的{
项目=(项目)调用.getArguments()[0];
项目。SETPROJECTD(10000);
project.setCollaborators(新的ArrayList());
setActiveAPI(新的ArrayList());
返回项目;
}
});
Map projectSettings=新建HashMap();
projectSettings.put(“projectname”、“helloworld”);
响应=projectRest.postProject(“用户”,projectSettings);
assertEquals(204,response.getStatus());
验证(projectDAOm,至少一次())。插入(新项目());
验证(apikeyGeneratorm,乘以(1)).generateKey(anyInt(),keyLength);
}
在被测试的类中:

public Response postProject(String user, Map<String, Object> data) {
    Project project = new Project();
    project.setProjectname((String) data.get("projectname"));
    User owner = userDAO.findById(user);
    project.setOwner(owner);
    projectDAO.insert(project); // ERROR OCCURS HERE
    Collaborator c = new Collaborator(owner, project);
    project.getCollaborators().add(c);
    owner.getOwnedProjects().add(project);
    owner.getCollaboratingProjects().add(c);
    Apikey apikey = new Apikey(apikeyGenerator.generateKey(project.getProjectid(), API_KEY_LENGTH));
    project.setApikey(apikey);
    apikey.setProject(project);
    apikey.setTimestamp(new Timestamp(Calendar.getInstance().getTimeInMillis()));
    projectDAO.insert(project);
    return Response.status(204).build();
}
公共响应后项目(字符串用户、地图数据){
项目=新项目();
project.setProjectname((字符串)data.get(“projectname”);
用户所有者=userDAO.findById(用户);
项目业主(业主);
projectDAO.insert(project);//此处发生错误
合作方c=新合作方(业主、项目);
project.getCollaborators().add(c);
owner.getOwnedProjects().add(项目);
owner.getCollaboratingProjects().add(c);
Apikey Apikey=新的Apikey(apikeyGenerator.generateKey(project.getProjectid(),API_KEY_LENGTH));
项目.setApikey(apikey);
apikey.setProject(项目);
setTimestamp(新的时间戳(Calendar.getInstance().getTimeInMillis());
插入(项目);
返回Response.status(204.build();
}

如果
insert
refresh
具有相同的签名,则该方法返回
null
。因此,您应该使用
doAnswer(new Answer(){…})。when(mock).method()

您的意思是
insert
而不是
refresh
作为您测试的方法吗?
insert
的签名是什么?我很抱歉。我的意思是插入。