ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20230203 TIL 테스트는 거짓말을 하지 않는다
    TIL 2023. 2. 3. 17:32


    어제는 아임포트 API를 서버에서 연결을 했고,
    오늘은 웹 클라이언트에서 내 서버의 API를 통해 아임포트 API를 활용할 수 있도록 API를 작업하고 있었다.

    @SpringBootTest
    @ActiveProfiles("test")
    class VerifyAccountServiceTest {
        private VerifyAccountService verifyAccountService;
        private UserRepository userRepository;
        @SpyBean
        private IamPort iamPort;
    
        @BeforeEach
        void setup() {
            userRepository = mock(UserRepository.class);
            verifyAccountService = new VerifyAccountService(userRepository, iamPort);
        }
    
        @Test
        void verify() {
            given(userRepository.findById(any()))
                    .willReturn(Optional.of(User.fake()));
    
            given(iamPort.getBankHolder(any(), any()))
                    .willReturn("홍길동");
    
            assertThat(verifyAccountService.verify(1L, new Bank("우리은행"), new AccountNumber("11111111"))).isNotNull();
        }
    }

    그런데 왜인지 모르게 위의 스프링 테스트에서 아래와 같은 에러가 발생하였다.

    IamPortError org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body]


    생성자를 직접 호출해서 테스트를 했을 때는 분명히 문제가 없었기 때문에
    일단 @SpyBean을 @MockBean으로 수정을 해서 테스트는 통과를 시켰다.
    그런데 불안했기 때문에 IamPort도 @Autowired를 통해 테스트를 해보았다.

    @SpringBootTest
    @ActiveProfiles("test")
    class IamPortTest {
        @Autowired
        private IamPort iamPort;
    
        @Test
        void issueAccessToken() {
            assertThat(iamPort.issueAccessToken()).isNotNull();
        }
    }
    

    그런데 동일한 에러가 발생하는 것이었다.

    IamPort는 아래와 같이 api키와 secret을 생성자 주입을 받고 있는데,

    public IamPort(String apiKey, String apiSecret) {
        this.apiKey = apiKey;
        this.apiSecret = apiSecret;
    
        this.setBankCodes();
    }

    확인을 해보니 apiKey값은 application.properties에 넣어둔 값을 잘 가져오는데,
    apiSecret값이 {iamport.api-secret} 이었다.
    확인을 해보니 아래 코드에서 $ 표시를 놓쳤던 것이었다.

    @Value("${iamport.api-secret}")


    오늘 몇 시간 동안 디버깅을 하면서 느낀 점은 외부 API를 사용하는 부분도 테스트를 작성하도록 하고,
    {application.properties key값}으로 값이 나온다면 $를 제대로 붙였는지 꼭 확인하자.


    댓글

Designed by Tistory.