-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
my-test-util
- now()가 실행되는 위치가 스프링 설정 클레스에 있는 경우?
#2
Comments
예제를 만들어서 확인해보았는데... 이건 설정클래스 문제가 아니였다. 해당 설정 부분이 고정되는 부분이 아니고, 호출 할 때마다 메서드 내용이 실행 되는데... 해당 요청에 대한 스레드가 새로 만들어질 경우 그 스레드의 now()는 mockStatic이 적용되지 않는다.
로거를 보면 알 수 있는데 설정 클래스 실행 부분에서 다른 스레드에서 모킹된 정적 메서드를 사용할 수 없다라는 이슈가 있는데 현재 Mockito 에 적용되진 않은 것 같다.
유틸리티 사용은 편해지긴 했는데... 결국 문제 해결은 안되었음.. 😅
TODO:
|
- 모두 단일 스레드(Test worker)로 실행되서, MockStatic이 원하는대로 동작함을 확인했다. - fp024/my-utils#2
Non-리액티브 방식으로 해보면, 문제가 없을 것 같아서...
|
문제
그동안은 잘 느끼지 못하던 문제인데...
Spring Security in Action 1판의 19장 예제를 확인하다가.. 아래 문제에 대해 알게되었다.
만약 now()의 실행위치가 테스트할 메서드 내부가 아닌 스프링의 설정 클래스애 있다면, 시간 고정을 할 수 없어 테스트가 실패함.
https://github.com/wikibook/spring-security/blob/1a5e63ff431e2e45dd3d1cd3882b4f3182a4f9b6/ssia-ch19-ex4/src/main/java/com/laurentiuspilca/ssia/config/ProjectConfig.java#L50-L66
권한 부여를 결정하는 조건 메서드가 위처럼 설정 클래스 안쪽에 있는 경우, 문제가 발생하는데..
저자님은 위의 조건을 테스트하는 코드를 따로 만들지는 않으셨는데... 나는 만들어보다가 이 문제를 알게되었다.
위 테스트를 실행하면, 테스트를 실행하는 시간에 아래와 같으면 HTTP 200응답이 되어 실패한다.
00:00 <= 테스트 시간 <= 12:00
당연한 문제이긴 했다. 😅
원인
해결 방향
@ExtensionWith
이 어노테이션을@SpringBootTest
보다 앞에 위치시키고 거기에 들어갈 초기화 클래스를 JUnit 5의BeforeEachCallback
,AfterEachCallback
등을 상속하는 형태로 만들어주면 될 것 같은데.... 음... 해봐야 알것 같은데.. 왠지 하면 잘 될 것 같다...😅해결
다음과 같이
@ExtendWith
와 알맞은 시간 타입의 어노테이션을 테스트 메서드에 설정하면 날짜 / 시간 고정이 되도록 했음.이 라이브러리 프로젝트의 자체 테스트를 했을 때는, 정상이었지만,
The text was updated successfully, but these errors were encountered: