728x90

https://edu.nextstep.camp/c/9WPRB0ys

NEXTSTEP에서 자바 플레이그라운드 with TDD, 클린코드라는 과제형(?) 강의를 시작했다

단계별로 과제를 풀며 공부하는 방식이라 이론보다는 실제 코드로 습득할 수 있기에 나에게 더 잘 맞을 것 같아서 신청하게 되었다

TDD, BDD는 나름대로 혼자 공부하면서 회사 업무에 적용해보려고 했지만 쉽지않았던 주제였기에 이번 강의가 굉장히 많은 도움이 많이 될 것 같은 느낌이 든다


요구사항 1

"1,2"을 ,로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현한다.
"1"을 ,로 split 했을 때 1만을 포함하는 배열이 반환되는지에 대한 학습 테스트를 구현한다.

@Test
void requirementCase1() {

    /*  "1,2"을 ,로 split 했을 때 1과 2로 잘 분리되는지 확인하는 학습 테스트를 구현한다. */
    String splitExampleString = "1,2";
    String[] splitExampleStringArray = splitExampleString.split(",");
    assertThat(splitExampleStringArray).contains("1");              // 포함 여부 확인
    assertThat(splitExampleStringArray).containsExactly("1","2");   // 순서를 포함해서 정확히 일치

    /* "1"을 ,로 split 했을 때 1만을 포함하는 배열이 반환되는지에 대한 학습 테스트를 구현한다. */
    splitExampleString = "1";
    splitExampleStringArray = splitExampleString.split(",");
    assertThat(splitExampleStringArray).contains("1");          // 포함 여부 확인
    assertThat(splitExampleStringArray).containsExactly("1");   // 순서를 포함해서 정확히 일치

}

요구사항 2

"(1,2)" 값이 주어졌을 때 String의 substring() 메소드를 활용해 ()을 제거하고 "1,2"를 반환하도록 구현한다.

@Test
void requirementCase2() {

    /* "(1,2)" 값이 주어졌을 때 String의 substring() 메소드를 활용해 ()을 제거하고 "1,2"를 반환하도록 구현한다. */
    String resultString = "1,2";
    String splitExampleString = "(1,2)";
    splitExampleString = splitExampleString.substring(1,splitExampleString.length()-1);

    assertThat(splitExampleString).isEqualTo(resultString);
}

요구사항 3

"abc" 값이 주어졌을 때 String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져오는 학습 테스트를 구현한다.
String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져올 때 위치 값을 벗어나면 StringIndexOutOfBoundsException이 발생하는 부분에 대한 학습 테스트를 구현한다.
JUnit의 @DisplayName을 활용해 테스트 메소드의 의도를 드러낸다.

@DisplayName("IndexOutOfBoundsException 예외 발생 확인")
@Test
void requirementCase3() {
    /* "abc" 값이 주어졌을 때 String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져오는 학습 테스트를 구현한다.
        String의 charAt() 메소드를 활용해 특정 위치의 문자를 가져올 때 위치 값을 벗어나면 StringIndexOutOfBoundsException이 발생하는 부분에 대한 학습 테스트를 구현한다.
        JUnit의 @DisplayName을 활용해 테스트 메소드의 의도를 드러낸다. */
    /* Error Message: String index out of range: 3 */

    String exampleString = "abc";
    int index = 3;

    /* hasMessageContaining: 포함된 문자 여부 확인 */
    assertThatThrownBy(() -> {
        exampleString.charAt(index);
    }).isInstanceOf(IndexOutOfBoundsException.class).hasMessageContaining("index out of range");

    /* 다른 표현 방식 */
    assertThatThrownBy(() -> {
        exampleString.charAt(index);
    }).isInstanceOf(IndexOutOfBoundsException.class).hasMessageContaining("%d", index);

    /* withMessageMatching: 모든 문자 일치 여부 확인 */
    assertThatExceptionOfType(IndexOutOfBoundsException.class).isThrownBy(() -> {
        exampleString.charAt(index);
    }).withMessageMatching("String index out of range: 3");

    /* 다른 표현 방식 */
    assertThatExceptionOfType(IndexOutOfBoundsException.class).isThrownBy(() -> {
        exampleString.charAt(index);
    }).withMessageMatching("String index out of range: \\d");

    /* TODO 다른 방법으로 예외 문구 변경 처리 가능한지 확인 필요 */
    assertThatExceptionOfType(IndexOutOfBoundsException.class).isThrownBy(() -> {
        try {
            exampleString.charAt(index);
        }catch (Exception e){
            throw new IndexOutOfBoundsException("Index: " + (exampleString.length()-1) + ", Size: " + exampleString.length());
        }
    }).withMessageMatching("Index: \\d+, Size: \\d+");

}

AssertJ Exception Assertions 문서 참고

 

AssertJ / Fluent assertions for java

AssertJ has many great features that not everybody is aware of, here are some of them. Basic tips : Iterable and arrays assertions : Advanced tips : We want to start typing asser and let code completion suggest assertThat from AssertJ (and not the one from

joel-costigliola.github.io

728x90
복사했습니다!