반응형
테스트를 상위 패키지인 domain 혹은 그 위의 패키지에서 한 번에 모든 클래스들을 실행하면 테스트가 모두 성공하지만, UserControllerTest를 단독으로 실행하면 오류 발생.
./gradlew build 명령 수행 시 마찬가지로 오류가 발생하며, 이로 인해 GitHub Action에서 오류가 발생한다.
문제 상황
- UserControllerTest 코드 중 일부.
- common > JwtUtils에 있는 메소드 중 하나인 getJwtSecretKey()의 값을 읽어오지 못하여서 발생하는 오류였다.
- getJwtSecretKey 메서드를 static으로 선언하였음에도 불구하고, 해결이 되지 않았다.
@BeforeEach
public void initGenerateJwtData() {
Key key = getJwtSecretKey(); // 실질적인 오류가 발생하는 부분. 값을 불러오지 못한다.
Date now = new Date();
long expireTime = Duration.ofDays(360).toMillis();
// Set header
Map<String, Object> header = new HashMap<>();
header.put("typ", "JWT");
header.put("alg", "HS512");
// Set payload A
Map<String, Object> payloadA = new HashMap<>();
payloadA.put("id", "test_A");
payloadA.put("email", "userControllerTestA@gmail.com");
payloadA.put("name", "testJwtUserA");
payloadA.put("provider", "google");
jwtDataA = Jwts.builder()
.setHeader(header)
.setClaims(payloadA)
.setSubject("UserControllerTest")
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + expireTime))
.signWith(key, SignatureAlgorithm.HS512) // 이 부분에서 java.lang.IllegalArgumentException: Key argument cannot be null. 오류 발생함
.compact();
}
내가 생각하는 문제의 원인
UserControllerTest는 현재 @WebMvcTest로, @SpringBootTest가 아니기 때문에 getJwtSecretKey() static method를 가진 JwtUtils class가 생성되지 않아서 오류가 발생하는 것으로 보인다.
해결 방법 1
- @TestPropertySource, Environment 사용
@WebMvcTest(controllers = UserController.class, ...
@TestPropertySource(locations = "classpath:application-jwt.properties") // 추가
class UserControllerTest {
// ....
@Autowired
private Environment env; // 추가
@BeforeEach
public void initGenerateJwtData() {
// import application-jwt.properties
String jwtSecret = env.getProperty("jwt.secret");
// encode
byte[] keyBytes = Decoders.BASE64.decode(jwtSecret);
SecretKey JWT_SECRET_KEY = Keys.hmacShaKeyFor(keyBytes);
Date now = new Date();
long expireTime = Duration.ofDays(360).toMillis(); // 만료날짜 360일 이후.
// Set header
// 위와 동일
// ....
해결 방법 2
- 직접 application-jwt.properties 파일을 읽어온다.
Properties properties = new Properties();
InputStream inputStream = JwtUtils.class.getClassLoader().getResourceAsStream("application-jwt.properties");
SecretKey key = null;
try {
if (inputStream != null) {
properties.load(inputStream);
String jwtSecretKey = properties.getProperty("jwt.secret");
byte[] keyBytes = Decoders.BASE64.decode(jwtSecretKey);
key = Keys.hmacShaKeyFor(keyBytes);
}
} catch (IOException e) {
System.out.println("error : " + e);
}
반응형
'멘질멘질] 2023 졸업 프로젝트' 카테고리의 다른 글
JWT] Secret key 랜덤 생성 (0) | 2023.06.16 |
---|---|
Spring Boot] 406 Not Acceptable 오류 (0) | 2023.06.13 |
JPA Repository Test] @SpringBootTest vs @DataJpaTest (0) | 2023.06.09 |
Spring Boot] CORS 해결 (0) | 2023.06.09 |
Spring Boot] 프로젝트를 진행하는 과정에서 원칙 정리 (0) | 2023.06.09 |