Groovy 查找两个对象是否匹配

Groovy 查找两个对象是否匹配,groovy,properties,iteration,Groovy,Properties,Iteration,我有一个方法来匹配两个对象。如果第一个对象的每个属性与第二个对象的属性匹配,则会发生匹配。我知道在Groovy中,我可以迭代一个对象的字段来实现这一点。问题是我遇到了一个我无法理解的异常 代码: 方法:私有匹配项目项目匹配,项目项目 项目类别: class Project { final String name final Person techLead } 我想做一些类似的事情: private boolean match(Project projectManaged, P

我有一个方法来匹配两个对象。如果第一个对象的每个属性与第二个对象的属性匹配,则会发生匹配。我知道在Groovy中,我可以迭代一个对象的字段来实现这一点。问题是我遇到了一个我无法理解的异常

代码:

方法:私有匹配项目项目匹配,项目项目

项目类别:

class Project 
{
    final String name
    final Person techLead
}
我想做一些类似的事情:

private boolean match(Project projectManaged, Project project) {
    project.properties.each { prop, value ->
        if(value != projectManaged["$prop"] {
            return false
        }
    }
    return true
}
但我得到了:

java.lang.AssertionError: Closure  com.gustavo.tribal.ProjectManagerImplTest$_testEditProjectShouldNotEditIfPriorityAlreadyExists_closure3@32da5a84 
should have failed with an exception of type com.gustavo.tribal.exceptions.WrongProjectException, 
instead got Exception java.lang.NullPointerException: Cannot invoke method call() on null object
这两个参数都不为null,但techLead的值同时适用于这两个参数。我确信空值和异常之间存在某种关系,但我不能正确地得到它

编辑:

测试是:

void testEditProjectShouldNotEditIfPriorityAlreadyExists() {
    projectManagerImpl.addProject(project)
    projectManagerImpl.addProject(project2)
    def msg = shouldFail(WrongProjectException) {
        projectManagerImpl.editProject(project, project2b)
    }
    assertEquals "Can't edit project as the requested priority (" + project2b.priority + ") is already in use", msg
}
以及editProject的代码:


结果是我的match方法中缺少了一个括号。另外,我应该使用projectManaged[prop]

而不是projectManaged[$prop],看起来您的单元测试失败了。你能给我们看一下那段代码吗?不知道为什么你不使用equals和hashcode?就我在阅读文献时所看到的情况而言,也就是说,我看到==和equals几乎一样,我对Groovy还是一个新手。另一方面,大多数参数都可以为null,所以我不应该执行x.equalsy,对吗?
void editProject(Project project, Project editedProject) {
    for(Project projectManaged : allProjects) {
        if(match(projectManaged, project)) {
            if(projectManaged.priority != editedProject.priority && usedPriorities.get(editedProject.priority)) {
                throw new WrongProjectException("Can't edit project as the requested priority (" + editedProject.priority + ") is already in use")
            }
            removeProject(project)
            addProject(editedProject)
        }
    }
}