-
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값}으로 값이 나온다면 $를 제대로 붙였는지 꼭 확인하자.
'TIL' 카테고리의 다른 글
20230206 TIL 계층 분리의 장점을 느껴보다 (0) 2023.02.06 20230204 TIL 어떻게 차별화할 것인가 (0) 2023.02.04 20230202 TIL RestTemplate으로 아임포트 API 호출하기 (1) 2023.02.02 20230201 TIL 효과 좋은 스트레스 풀어주는 방식을 찾다 (2) 2023.02.01 20230131 TIL 은행 목록을 어떻게 관리하는 것이 좋을까? (0) 2023.01.31