개발관련/(과거)메모

JUnit과 함께하는 AssertJ

동팡 2019. 11. 12. 11:14

상황

- JUnit을 통한 단위테스트 작성

- 기능 검증을 해야함(예외 검증은 안함)

 

Given-When-Then

 - 단위 테스트할 때 많이 사용되는 테스트 패턴

 - 코드의 가독성을 높임

 - Given

  ==> 테스트 시나리오를 시작하기 전에 초기화 절차(pre-conditions, 사전 절차)

 - When 

  ==> 테스트 시나리오의 실제 작업(테스트)

 - Then

  ==> 테스트 시나리오에 대한 예상 결과(검증 절차)

 

EX-01(코드 설명은 AssertJ 절에 있음)

        // GIVEN
        final String uuid = "fc8833de-70d2-4ece-b063-fede3a3c59fe";

        // WHEN
        ArrayList<Byte> reqCreatePacket = reqCreate();
        ArrayList<Byte> respCreatePacket = respCreate( uuid );
        ArrayList<Byte> reqDestroyPacket = reqDestroy( uuid );
        ArrayList<Byte> respDestroyPacket= respDestroy( uuid );

        // TEHN
        KMIPDecoder decoder = new KMIPDecoder();
        KMIPContainer container;

        container = decoder.decodeRequest( reqCreatePacket );
        assertThat( container.getBatch( 0 ).getTemplateAttributeStructure( 0 ).getAttributes() )
                .isNotEmpty()
                .hasSize( 3 )
                .extracting( "class" )
                .contains( CryptographicAlgorithm.class, CryptographicLength.class, CryptographicUsageMask.class );


        container = decoder.decodeResponse( respCreatePacket );
        assertThat( container.getBatch( 0 ).getAttributes() )
                .isNotEmpty()
                .hasSize(2)
                .extracting( "class" )
                .contains( ObjectType.class, UniqueIdentifier.class );
        assertThat( container.getBatch( 0 ).getResultStatus().getValue() )
                .isEqualTo( EnumResultStatus.Success );

        container = decoder.decodeRequest( reqDestroyPacket );
        assertThat( container.getBatch( 0 ).getOperation().getValue() )
                .isEqualTo(EnumOperation.Destroy );
        assertThat( container.getBatch( 0 ).getAttributes() )
                .hasSize( 1 )
                .extracting( "class" )
                .contains( UniqueIdentifier.class );

        container = decoder.decodeResponse( respDestroyPacket );
        assertThat( container.getBatch( 0 ).getResultStatus().getValue() )
                .isEqualTo( EnumResultStatus.Success );
        assertThat( container.getBatch( 0 ).getAttributes() )
                .hasSize( 1 )
                .extracting( "class" )
                .contains( UniqueIdentifier.class );

 

AssertJ의 사용

사용 이유

 - JUnit 기본 제공 Assert 개불편함.

 

사용 방법

pom.xml

     <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>1.7.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Code

import static org.assertj.core.api.Assertions.assertThat;
assertThat( [$값] ).[$값을 검증하기위한 메소드들]

지금 사용하는 버전은 Java6을 지원하기 위해 낮은 버전을 선택했다.

현재 3? 버전까지 나온것으로 기억ㅎ마

메소드 이름이 직관적이라서 눈으로 보면 대강 코드 흐름을 읽을 수 있다. 

 

ArrayList 검증하면서 주의해야할 것은 하나였던 것 같다.

 - ArrayList의 요소 검증 즉, Contains의 검증은 Object Equals 메소드를 통해 검증을한다.

 - 제대로된 Contains을 검증하기 위해서는 Object의 Equals 메소드를 오버라이딩해야한다(Object Equals 오버라이딩 주의사항도 지키구..;).

 - String 이외 primitive type은 상관없는 것 같다. 

 

활용

AssertJ를 통해 기능의 가지 검증과 예외 검증을 할 수 있다.

해당 사항을 시나리오별 차곡차곡 모아두면 결국 통합테스트를 구현할 수 있다.