Zero to Hero
article thumbnail
Published 2021. 7. 20. 22:06
Class.isAssignableFrom Programming

서비스에서 생성된 객체에 대한 검증 과정은 반드시 필요하다.

검증하는 방법 및 검증하는 대상은 도메인과 비즈니스 로직에 따라 다르기 때문에 이에 맞는 테스트 코드를 작성하는 건 쉽지 않다.

 

그럼 객체가 특정 인터페이스 및 클래스를 상속받았다는 것을 테스트 코드로 작성하려면 어떻게 해야 할까?

 

AppleSilicon.java

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public abstract class AppleSilicon {

    private int ram;
    private int ssd;
    private int gpu;
    private String deviceType;

    public static AppleSilicon makeAppleDevice(int ram, int ssd, int gpu, String deviceType)
        throws IllegalAccessException {
        switch (deviceType) {
            case "laptop":
                return new Macbook(ram, ssd, gpu, deviceType);
            case "desktop":
                return new Imac(ram, ssd, gpu, deviceType);
            case "tablet":
                return new Ipad(ram, ssd, gpu, deviceType);
        }
        throw new IllegalAccessException("error");
    }
}

코드를 보면 makeAppleDevice로 AppleSilicon을 상속받는 객체들을 만들어서 사용하는 것 같다.

 

@Getter
@Setter
public class Macbook extends AppleSilicon {

    protected Macbook(int ram, int ssd, int gpu, String deviceType) {
        super(ram, ssd, gpu, deviceType);
    }
}
@Getter
@Setter
public class Imac extends AppleSilicon {

    public Imac(int ram, int ssd, int gpu, String deviceType) {
        super(ram, ssd, gpu, deviceType);
    }
}
@Getter
@Setter
public class Ipad extends AppleSilicon {

    public Ipad(int ram, int ssd, int gpu, String deviceType) {
        super(ram, ssd, gpu,deviceType);
    }
}

Concrete Class는 다음과 같다.

 

Class.isAssignableFrom()

isAssignableFrom은 Class에 있는 메서드다. 이 메서드를 이용하면 해당 객체가 특정한 클래스나 인터페이스를 상속받고 있는 것을 체크할 수 있다.

 

테스트 코드

class AppleSiliconTest {
    @Test
    void makeMacbook() throws IllegalAccessException {
        final int ram = 16;
        final int gpu = 5500;
        final int ssd = 512;
        final String deviceType = "laptop";

        final AppleSilicon device = AppleSilicon.makeAppleDevice(ram, gpu, ssd, deviceType);

        assertTrue(Macbook.class.isAssignableFrom(device.getClass()));
    }

    @Test
    void makeMacbookWithException() throws IllegalAccessException {
        final int ram = 16;
        final int gpu = 5500;
        final int ssd = 512;
        final String deviceType = "desktop";

        final AppleSilicon device = AppleSilicon.makeAppleDevice(ram, gpu, ssd, deviceType);

        assertTrue(Macbook.class.isAssignableFrom(device.getClass()));
    }

}

테스트 결과

makeMacbookWithException 코드는 deviceType을 desktop으로 주었으나 Macbook 클래스를 상속받았는지 체크하기 때문에 기대했던 대로 테스트를 통과하지 못했다.

 

'Programming' 카테고리의 다른 글

[2021 ver.] 서버 개발자 mac 장비 설정  (0) 2021.08.02
Mockito.doNothing()  (0) 2021.07.21
Chapter9. 디플로이먼트: 선언적 애플리케이션 업데이트  (0) 2021.07.19
@cache  (0) 2021.06.28
Flask 사용법  (2) 2021.05.17
profile

Zero to Hero

@Doljae

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!