기록

Junit assertEquals 메소드 톺아보기 본문

[Study]/Kotlin

Junit assertEquals 메소드 톺아보기

Dannnnnn 2023. 4. 21. 04:25
반응형
    @Test
    fun add() {
        val name = "홍길동"
        val number = "010-1111-1234"
        
        val expect = User(name, number)
        val actual = phoneBookImpl.add(name, number)
        
        assertEquals(expect, actual)
    }

User 리스트에 새로운 User를 추가해주는 메소드를 테스트 하려니, 원하는 결과가 나오지 않았다.

 

둘의 객체 값의 주소가 다르다는 메시지이다.

뭐가 문제일까?

 

class User (val name: String, val number: String)​

일단 답을 먼저 말하면, 바로 User 클래스에서 equals 메소드를 오버라이드 하지 않았기 때문이다.

 

data class User (val name: String, val number: String)​

이렇게 클래스를 data 클래스로 만들어주면 문제는 해결이 된다.

 

속이 시원해지는 초록 체크를 볼 수 있다.

 

여기서 끝내지 말고 조금만 더 문제를 살펴보자.

Test 코드에서 equals 메소드를 직접 사용하고 있지 않은데, 왜 equals 메소드를 오버라이드 한 것이 영향을 미쳤을까?

(data class는 equals 메소드 외 몇 가지 메소드들을 자동으로 구현해준다.)

 

assertEquals 메소드에서 equals를 사용하여 값을 반환하고 있을 것 같다. 확인해보자.

 

	/**
	 * <em>Assert</em> that {@code expected} and {@code actual} are equal.
	 * <p>If both are {@code null}, they are considered equal.
	 *
	 * @see Object#equals(Object)
	 */
	public static void assertEquals(Object expected, Object actual) {
		AssertEquals.assertEquals(expected, actual);
	}​

Assertions.java

	static void assertEquals(Object expected, Object actual, String message) {
		if (!objectsAreEqual(expected, actual)) {
			failNotEqual(expected, actual, message);
		}
	}

AssertEquals.java

	static boolean objectsAreEqual(Object obj1, Object obj2) {
		if (obj1 == null) {
			return (obj2 == null);
		}
		return obj1.equals(obj2);
	}

Object.java

 

메소드를 타고 확인해보니, 실제로 Object의 equals 메소드를 사용하는 것을 알 수 있다.

 

    public boolean equals(Object obj) {
        return (this == obj);
    }

AssertionUtils.java

 

모든 클래스의 최상위 클래스인 Object의 equals 메소드는 단순히 현재 객체와 파라미터로 넘겨 받은 객체를 비교한다. 객체와 객체의 비교는 기본적으로 '주소값'이 된다.

 

그렇기에 data class로 User 클래스를 만들지 않았었기에 equals 메소드를 오버라이드 하지 않았고, 주소값을 비교하여 Test가 실패하는 경우가 발생하게 되었다.

 

이러한 실제적인 오류가 발생할 수 있는 이유로 코틀린에서 데이터를 담을 땐 Data Class를 사용하는게 좋겠다.

 

의문이 있을 땐 단순히 해결에서 멈추지 않고, 코드를 까보며 원인까지 파악하는 습관을 들이자.

반응형