Daily Notebook

[JUnit 4] @Nested 없이 계층 구조의 테스트 코드 작성하기

by 배부른코딩로그
💡 JUnit4에서 계층 구조의 테스트 코드를 작성해보자!

목표

  • 계층 구조의 테스트 코드를 설명할 수 있다.
  • JUnit4에 @Nested가 없어도 계층 구조로 테스트를 작성할 수 있다.
  • 기존에 작성한 JUnit5의 @Nested와 어떻게 다른지 설명할 수 있다.

 

의지와 상관없이 노후화된 서비스가 있다면, JUnit 5를 사용하지 못하는 경우가 생기기 마련이다.

계측 구조의 테스트 코드는 조금 더 읽기 쉽고 명료한 테스트를 작성할 수 있게끔 도와주는데,

불행하게도 JUnit4는 @Nested 애노테이션을 사용할 수 없다.

 

@Nested 애노테이션은 JUnit 5부터 릴리즈 되었기 때문이다.

링크된 글에서 간단한 예제를 살펴볼 수 있다.

 

이러한 JUnit4의 단점은 다음과 같은 라이브러리를 통해 개선할 수 있다.

<dependency>
    <groupId>de.bechte.junit</groupId>
    <artifactId>junit-hierarchicalcontextrunner</artifactId>
    <version>4.12.2</version>
    <scope>test</scope>
</dependency>

 

위 의존성을 추가했다면, Test Class(JUnit Test Case)를 만들어보자.

@RunWith(HierarchicalContextRunner.class)
public class Junit4LikeNestedTest {

}

`@RunWith(HierarchicalContextRunner.class)` 애노테이션을 추가하면, 계층 구조의 테스트를 작성할 수 있다.

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import de.bechte.junit.runners.context.HierarchicalContextRunner;

@RunWith(HierarchicalContextRunner.class)
public class Junit4LikeNestedTest {

	static TestMethod method;

	@Before
	public void setup() {
		method = new TestMethod();
	}
	public class Nested_Deep1 {

        public class Nested_Deep2 {

            String validFixture = TestFixture.validFixture;
            String invalidFixture = TestFixture.invalidFixture;

            @Test
            public void withValidRequest() {
                String response = null;
                try {
                    Assert.assertEquals(true, Util.isNotNull(validFixture));
                    response = method.send(String.valueOf(validFixture));

                    Assert.assertEquals(true, Util.isNotNull(response));
                    Assert.assertEquals(
                            AgentResponseCode.SUCCESS,
                            AgentResponseCode.enumTypeOf(code));
                } catch (Exception e) {
                    e.printStackTrace();
                    Assert.fail("Response code: " + response);
                }
            }

            @Test
            public void withInvalidRequest() {
                String response = null;
                try {
                    Assert.assertEquals(true, Util.isNotNull(invalidFixture));
                    response = method.send(String.valueOf(invalidFixture));
                    
                    Assert.assertEquals(true, Util.isNotNull(response));
                    Assert.assertEquals(
                            AgentResponseCode.REQUEST_PARAM_ERROR,
                            AgentResponseCode.enumTypeOf(response));
                } catch (Exception e) {
                    e.printStackTrace();
                    Assert.fail("Response code: " + response);
                }
            }
        }

    }

}

간단한 계층 구조의 테스트 코드를 작성해보았다.

기존과 다르게 inner class를 작성 후 JUnit Test를 실행해도 테스트가 정상적으로 동작하는 것을 확인할 수 있다.

√ com.junit.test.nested.Junit4LikeNestedTest
└─ √ com.junit.test.nested.Junit4LikeNestedTest.Nested_Deep1
   └─ √ com.junit.test.nested.Junit4LikeNestedTest.Nested_Deep2

@DisplayName 애노테이션을 사용할 수 없기 때문에 각 테스트 제목은 아쉽긴 하다.

하지만, 테스트 코드를 계층 구조로 작성하는 것만으로도 관심사 별로 구분/분류하기 쉬워진다.

 

이는 더 읽기 쉽고 명료한 테스트를 작성할 수 있게 된 것이다!!!

 

 

개발 환경이 완벽할 수 없다고 생각한다.

스테이블 한 레거시가 필요한 곳도 존재하기 때문이다.

할 수 있는 범위 내에서 코드 리팩터링 하고, 더 읽기 쉽고 명료한 코드를 작성해야 한다.

나를 위해서가 아닌 후배를 위한 테스트 코드는 필수적이다.

 

 

출처

 

Last Updated. 2022. 04. 21.

 

반응형

블로그의 정보

배부른코딩로그

배부른코딩로그

활동하기