인프런 커뮤니티 질문&답변

dev님의 프로필 이미지
dev

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

@ParameterizedTest

환경변수 관련되서 여쭤볼게 있습니다~

작성

·

560

0

mock 테스트 중에
환경변수(@Value)를 가져와야하는데,
@SpringBootTest가 아니라서 환경변수를 못가져오고 있습니다.

그래서 환경변수를 담은 변수가 null이 나오기 때문에 테스트를 못하고 있는데, 이럴 경우 어떻게 하시나요??

일단 환경변수 대신, 생성자를 통해 해당 변수들을 받는 형태로 리펙토링했는데, 프로덕션 코드들을 테스트에 맞추는 거 같아서 약간 딜레마가 오고있어요.

선생님께서는 이런 경우 어떻게 하시나요?
1. 환경변수 이슈
2. 프로덕션 코드를 테스트코드에 맞추는 리펙토링
(2번은 수업에 있네요 ㅎㅎ)

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, dev 님! :)

정확히 어떤 코드인지 알 수는 없어서 조심스럽지만, 말씀하신 것처럼 객체 입장에서 환경 변수를 어떻게 받느냐에 대한 방법 차이 정도는 감안할 수 있어 보입니다.
필드 주입 대신 생성자 주입을 사용한다고 했을 때, 사실 생성자를 통해서 외부에서 어떤 값을 받는 것은 객체 입장에서 아주 당연한 일인데요.

제가 말씀드린 내용은 애초에 "테스트 코드만을 위한" 로직을 억지로 추가하는 것을 경계하고자 함이었어서, 테스트의 용이성을 위해 인스턴스 생성 방식을 수정하는 방법은 초기 코드가 의도한 것을 변경함으로써 감안해야 할 부분이 생기는 것에 비하면 얻는 효과가 크다고 판단할 수도 있을 것 같아요.

그리고 조금 다른 관점에서, @SpringBootTest 환경이 아닌 단위 테스트 환경에서 @Value에 대한 연관 관계가 생겼다는 것은 설계 부분에서 더 나은 방식이 없을지 고민해볼 필요도 있어보여요.
프레임워크가 필요 없는 단위 테스트라 함은 프레임워크의 의존도가 없는 환경에서 충분히 테스트 가능한 순수 자바 코드일 가능성이 높은데, 이미 프레임워크를 의존하는 설계 때문에 요런 고민 포인트가 나온 것 같기도 하거든요. (코드를 본 게 아니라서 추측일 뿐입니다. ㅎㅎ 아니라면 넘어가 주세요.)

도움이 되셨기를 바랍니다.
감사합니다! :)

0

안녕하세요, 인프런 AI 인턴입니다.

님의 환경변수 관련 문제에 대해 답변 드리겠습니다.

  • 환경변수 이슈:

Spring Boot 테스트 시 @Value로 주입받는 환경변수를 사용할 경우 @SpringBootTest를 사용하지 않고 테스트 환경에서도 환경변수 값을 주입받고 싶다면 TestPropertyValues 클래스를 활용할 수 있습니다. TestPropertyValuesConfigurableEnvironment 혹은 ConfigurableApplicationContext에 프로퍼티를 빠르게 추가할 수 있도록 해줍니다. 다음은 TestPropertyValues를 사용한 예시 코드입니다.

Java 예시:

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.mock.env.MockEnvironment;
import static org.assertj.core.api.Assertions.assertThat;

class MyEnvironmentTests {

    @Test
    void testPropertySources() {
        MockEnvironment environment = new MockEnvironment();
        TestPropertyValues.of("org=Spring", "name=Boot").applyTo(environment);
        assertThat(environment.getProperty("name")).isEqualTo("Boot");
    }
}

더 자세한 정보는 Spring Boot Reference Documentation 참조

이방법을 사용하면 실제로 구동되는 환경의 @Value 주입 없이 테스트 환경에서만 필요한 프로퍼티 값을 설정할 수 있어 프로덕션 코드의 변경 없이 테스트가 가능합니다.

  • 프로덕션 코드를 테스트코드에 맞추는 리펙토링:

프로덕션 코드를 테스트 코드에 맞추는 것은 바람직하지 않습니다. 테스트가 프로덕션 코드의 설계를 개선하는데 도움을 줄 수는 있지만, 테스트를 위해 프로덕션 코드를 변경하는 것은 지양해야 합니다. 대신 테스트를 위한 구조를 마련하거나 테스트 더블(예: 목 객체)을 사용하는 것이 좋습니다.

기존의 환경에 맞게 테스트를 진행하는 방법을 찾는 것이 중요하며, 필요시 테스트를 위한 추가 설정을 고려해볼 수 있습니다. 또한, DI(Dependency Injection)를 활용하여 구성요소를 테스트하기 쉽게 만드는 것도 하나의 좋은 방법입니다.

이렇게 테스트를 위한 환경 설정과 설계를 잘 고려하여 프로덕션 코드의 품질을 높이고, 안정적인 테스트를 진행할 수 있기를 바랍니다.

dev님의 프로필 이미지
dev

작성한 질문수

질문하기