2013-04-10 3 views
0

다른 클래스와 비슷한 작업을 수행하는 많은 단위 테스트를 작성하고 있습니다.Java : 두 세트의 선택적 비교

나는 동일한 클래스의 세트를 비교하고 싶다. 클래스는 id 속성을 지정합니다. 세트 A에서는이 프로퍼티가 모두 null입니다. Set B에서이 속성이 설정됩니다. (세트 B가 데이터베이스에 유지되고 uid가 채워짐).

내 단위 테스트에서는 Set A가 Set B와 일치하는지 확인하고 싶은데 분명히 id 필드를보고 싶지 않습니다.

가장 효율적이고 깨끗하며 건조한 방법은 무엇입니까?

+1

진지하게, 사람, 가까운/아래 투표는 무엇입니까?어쩌면 완벽한 질문은 아니지만, 먼저 남자에게 강타하는 대신에/증언하라고 부탁하십시오. – MaDa

답변

1

우선 두 세트의 크기를 비교합니다. 둘 중 하나가 같지 않으면 테스트가 실패합니다.

중요하지 않은 경우 set 요소에 대해 java.util.Comparator을 정의하고이 비교 자에 따라 두 가지를 정렬합니다 (비교하지 않으려는 속성을 포함하거나 생략 할 수 있음). 그런 다음 규칙에 따라 요소를 비교하여 두 세트를 반복합니다 (올바르게 이해하면 비교 자로 정의 된 요소와 다릅니다).

equalshashCode 메서드가 제대로 정의되어 있고 테스트를 위해 변경하지 않으려는 것으로 가정합니다.

+0

MaDa는 테스트를 위해 테스트중인 클래스를 변경하고 싶지 않다는 가정하에 MaDa가 매우 정확하기 때문에이 답변을 선택했습니다 (즉, 서로 다른 equals 및 hashCode 메소드 정의) –

0

두 메소드 모두에 id 필드를 포함하지 않아야하는 클래스의 hashCode() 및 equals() 메소드를 대체해야합니다. 그러면 equals 메소드 Set가 원하는 방식으로 작동합니다. 예를 들어

class Test{ 

int id; 
String name; 
String other; 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    result = prime * result + ((other == null) ? 0 : other.hashCode()); 
    return result; 
} 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Test other = (Test) obj; 
    if (name == null) { 
     if (other.name != null) 
      return false; 
    } else if (!name.equals(other.name)) 
     return false; 
    if (this.other == null) { 
     if (other.other != null) 
      return false; 
    } else if (!this.other.equals(other.other)) 
     return false; 
    return true; 
} 

}

이제 테스트 클래스 객체 ID에 의존하지 않습니다. Eclipse와 같은 IDE를 사용하여 equlas 및 hashCode 메소드를 매우 쉽게 생성 할 수 있습니다.

0

당신은 당신의 클래스에서 equals() & hashCode() 메소드를 오버라이드 (override) 다음 Set B에서 모든 요소를 ​​제거하기 위해 removeAll() 방법을 사용할 수 있습니다. 이 글은 세트가 비어 있으면 일치하고, 그렇지 않은 경우 게시합니다.

오버라이드 된 메서드에는 id이 포함되지 않은 논리가 있어야합니다.

0

중복 항목 로직에 대한 비교는 equals() 메소드를 사용하여 Java에서 수행됩니다.

myString.equals ("compare this");

고객 유형의 개체를 비교해야 할 때 equals 메서드를 재정의해야합니다.

Student student1=new Student(); 
Student student2=new Student(); 
student1.equals(student2); 

그러나 equals() 메소드를 재정의 할 때는주의해야합니다. 일부 고유 ID를 기반으로 비교 근거를 제공해야합니다. 예를 들어, 다음 구현에서는 롤 번호를 비교를위한 고유 ID로 사용합니다.

public class Student { 

    private int rollNo; 
    private String name; 
    private String address; 


    // Getters and Setters 

@Override 
    public int hashCode() { 
    // Overide this only when you use Hashing implementations 
    } 

    @Override 
    public boolean equals(Object obj) { 
    if (obj == null) { 
     System.out.println("Not Equal due to NULL"); 
     return false; 
    } 
    if (this == obj) { 
     System.out.println("Equals due to same reference"); 
     return true; 
    } 
    if (getClass() != obj.getClass()) { 
     System.out.println("Different Type"); 
     return false; 
    } 
    Student other = (Student) obj; 
    if (rollNo == other.rollNo) { 
     System.out.println("RollNo " + rollNo + " EQUALS " + other.rollNo); 
     return true; 
    } 
    if (rollNo != other.rollNo) { 
     System.out.println("RollNo " + rollNo + " NOT EQUALS " + other.rollNo); 
     return false; 
    } 
    System.out.println("Default is FALSE"); 
    return false; 
    } 

}