본문 바로가기

Language & Framework/삽질기록

삽질기록(12) 레디스 적용된 코드 어떻게든 꾸역꾸역 단위테스트 하기

2022-12-14

이런 헛짓할 필요 없이 인터페이스를 이용했으면 모킹 가능했다..

SOLID원칙의 DIP는 밥 말아먹은 코드를 작성한 나의 잘못일 뿐

이런 기본적인 부분에 대한 이해조차 부족했었다는 게 너무 부끄럽다..

그래도 글은 남겨놓는다.. 과거를 보고 더 성장하라고.. ㅎ

 

 

 

 

레디스 적용 이후 레디스가 사용된 곳들은 지금까지 열심히 작성한 단위테스트가 모두 삽질이 되어버렸다.

왜?

 

이 녀석 모킹이 안된다.

무슨 짓을 해도 실제 캐시를 호출하고 앉아있다.

 

나의 검색 실력이 부족한 것인지 이를 해결할 방법을 찾지 못했다.

 

사실 너무 바빠서 이 상태로 거의 일주일 넘게 방치해뒀는데, 이걸 어떻게든 해야겠다는 생각이 들었다.

 

그래 맞다, 이거 해결 안해도 코드는 잘만 작동된다.

그리고 그냥 통합테스트로 퉁쳐도 되기는 한다.

아니면 레디스에 그냥 BeforEach 이런 걸로 실제 값 넣어도 된다.

 

근데 열받으니까 어떻게든 해야함 ㅅㄱ

 

이번 프로젝트의 기본 모토가 나름 TDD인데 이런 걸 방치해서는 도저히 견딜 수가 없다.

 

 

 

 

내 RedisRepository는 이렇게 생겼다.

별거 없다.

 

Spy를 하든 Mock을 하든 뭔짓을 해도 안 먹히는 이놈을 어떻게 해야할까?

머리가 나쁘면 몸이 고생한다고 정석을 찾지 못해서 나는 그냥 구현체 직접 만들어서 해결하기로 했다 ㅎㅎ

 

 

 

 

 

그래.. 그래서 이렇게 직접 만들었다..

Type별로 TestImpl을 따로 만드는 방법도 있겠지만 귀찮아서 생략했다.

 

물론 테스트에 영향이 있다면 신경써서 만들어야겠지만 내 생각엔 테스트에 문제되는 부분은 없을 것 같다.

 

이제 레디스가 비어있는 경우를 테스트하고 싶다면 REDIS_AUTH_KEY_EMPTY 같은 미리 등록해놓은 상수를 쓰면 되고, 반환값이 있는 경우를 테스트하고 싶다면 REDIS_AUTH_KEY 이런 거 쓰면 된다.

 

인정한다, 딱히 좋아보이는 형태는 아니다.

 

근데 다른 해결책을 못찾겠다 ^^.. 누가 제발 나에게 정답을 알려줘

 

적용 방법은 간단하다.

 

 

 

리플렉션을 이용해서 해당 구현체를 강제로 주입한다.

 

 

 

레디스를 조회해서 값이 비어있을 경우 예외를 던지는 로직인데, 레디스 레파지토리가 모킹되지 않아서 무슨짓을 해도 실패하던 테스트였다.

이제는 강제로 주입한 구현체의 룰을 따르기 때문에 내가 정한대로 값을 반환하고 테스트가 성공한다.

 

조금 허접해보이긴 하지만 그래도 죽어있던 테스트들을 살릴 수 있어서 기쁘다..