Project 해축갤/테스트 코드(9)
-
JUnit5 테스트 메서드는 왜 public 이면 안될까?
최근 코드 품질을 올리고 싶어 IDE에 SonarLint을 설치했더니 다음과 같은 경고를 받게 됐다. 요는 테스트 메서드에서 public 접근 제어자를 없애라라는 경고이다. 필자가 아는 지식은 JUnit 이 실행시에 테스트 메서드를 Reflection API로 뜨기 위해서 public 접근 제어자가 필수라고 알고 있었다. JUnit 5 제작자 왈 public 일 필요는 없지만, private 이면 안된다! 일반적으로 public 제어자는 기술적인 모종의 이유가 아닌 이상 쓰지 말아라 [출처] : https://junit.org/junit5/docs/current/user-guide/#writing-tests-classes-and-methods 요약하자면 우리 JUnit 5 팀은 "Less is more"..
2024.01.08 -
Java @Scheduled: 매시 정각에 실행되는 Cron 표현식 테스트하기
배경 @Transactional @Scheduled(cron = "0 0 * * * *") public void updatePopularPosts() { // 새로운 상위 10개 게시물 추출 List top10Posts = postRepository.findTop10Posts(); // 기존의 data 삭제 popularPostRepository.deleteAllInBatch(); // 변환 후 새로운 data 삽입 List popularPosts = convertToPopularPost(top10Posts); popularPostRepository.saveAll(popularPosts); } 위 함수에 대한 테스트 코드를 작성해보려 하다 이런 글을 쓰게 되었습니다. 테스트의 목적은 매 정시에 함수가 실..
2023.12.20 -
테스트 띠띠ㅣ디ㅣ디ㅣ딛ㄹ딸깍? postman 으로 '띡띡딸깍' 하기
현재 다음과 같은 작업을 진행 중에 있습니다. 💡 데이터베이스에 1억 건이 있을 때 나의 가련한 API의 성능(반응시간)은 어느 정도 나올까? 현재 조회 쿼리는 인덱스도 뭐도 없고 단순한 형태의 CRUD 의 조회용 쿼리이기 때문에 1억 건에서 데이터를 뽑는 데는 실제로 오래 걸릴 것입니다. // 실제 사용하는 오늘의 코드 @Override public List findAllDTOs(Integer offset, Integer limit) { return queryFactory .select(new QPostDbDTO( post.id, post.title, post.content, post.member.name, post.isDeleted, post.reg_date )) .from(post) .orderBy..
2023.11.30 -
Hibernate의 "Detached Entity Passed to Persist" 오류 이해와 해결
오류 이해하기 Detached(준영속) 상태란? Hibernate 및 JPA에서 엔티티의 생명주기 중 하나인 'Detached' 상태는 영속석 컨텍스트가 더 이상 해당 객체를 추적하지 않을 때 발생합니다. 세션이 닫히거나(close), 클리어될 때(clear), 또는 수동으로 영속성 컨텍스트에서 제거(detach) 될 때 이 상태에 도달할 수 있습니다. Entity의 상태 코드 EntityState enum을 보면 public enum EntityState { PERSISTENT, TRANSIENT, DETACHED, DELETED; static final CoreMessageLogger LOG = CoreLogging.messageLogger( EntityState.class ); /** * Deter..
2023.11.08 -
org.mockito.exceptions.misusing.UnnecessaryStubbingException 해결
// PostService의 게시글 수정(updatePost) 정상 케이스 테스트 코드 @Test public void updatePost_ShouldChangePostDetails_WhenUpdateInfoIsValid() throws Exception { // given - 상황 만들기 Long postId = 1L; PostUpdateDTO postUpdateDTO = PostUpdateDTO.builder() .title("Updated Title") .content("Updated Content") .build(); Post existingPost = Post.builder() .id(postId) .title("Title") .content("Content") .build(); when(pos..
2023.11.07 -
테스트를 더 빨리 끝내보기 (feat. 자료구조, singletonList)
https://github.com/xpmxf4/HaeChuk-Gallery/blob/main/src/test/java/HailYoungHan/Board/controller/PostControllerTest.java 위와 같은 코드가 있는 데 테스트하는 게 일일이 귀찮아서 시작했던 테스트 코드를 이제는 더 빨리 굴려볼 수는 없을까 라는 고민이 들어 코드를 한번 개선해보고자 했습니다. 그렇다면 어떤 부분을 개선할 수 있을까 라는 고민을 하다가 List allPosts 부분을 봤습니다. 자료구조를 사용한다면 어떻게 더 빠른 코드가 생성이 될 수도 있지 않을까 싶었습니다. 그래서 다음 2가지 코드를 한번 짜봤습니다. List 자료구조를 활용해 게시물 담기 처음은 기존처럼 Arrays.asList() 를 사용해 ..
2023.11.02 -
테스트 코드 작성 시 유의할 점 (Mockito doNothing)
https://github.com/xpmxf4/HaeChuk-Gallery/blob/main/src/test/java/HailYoungHan/Board/controller/CommentControllerTest.java 위는 다 작성된 테스트 코드입니다. 중간에 오늘의 주제가 있는 데 바로 doNothing입니다. 해축갤 프로젝트에서 댓글 생성을 담당하는 Controller의 API 슬라이스 테스트 코드를 작성 중에 쓴 글입니다. 이 함수는 dto를 파라미터로 넘겨받아 Entity 객체로 전환 후, 이를 repository를 통해서 save 하는 함수입니다. CommentService는 Mock 객체이기 때문에 사실할 이유가 없어도 무방하지만 그래도 하는 게 좋은 이유가 있습니다. CommentServi..
2023.11.02 -
postman 띡띡딸깍 귀찮아서 테스트 코드 짭니다
매번 기능 만늘때마다 postman 띡 띡 딸깍 하며 기능 테스트 하는 게 너무나 귀찮습니다. '귀차니즘'이 많은 개발자냐고요? 네! 그거 잘못된 거 아니냐고요? 는 장난입니다만, 사실 진짜 알빠노이긴 합니다. 저는 귀찮은 일은 정말 질색입니다. 매번 기능, 코드 수정할 때 마다 일일히 postman 띡띡딸깍 하기 싫기도 하죠. 그리고 많은 사람들이 CI/CD 를 구축했다면서 테스트 없는 CI 를 구축한 경우를 여럿 봐왔는 데 사실 이건 CI 가 아니라고 생각합니다. 추후 생길 (사실 이미 매번 배포하다가 귀찮음을 겪어버리고) CI/CD 구축을 위해서라도 테스트 코드를 작성해야 할 이유가 있죠. 그래서 이번 기회에 아얘 테스트 코드를 작성하기로 했습니다. 뭘 테스트 해야 하나? 결국 나는 어플리케이션을 ..
2023.10.31 -
Spring Boot JUnit5 : JPA metamodel must not be empty 에러 솔루션
상황 아마 이 에러가 나신 분들은 Controller 에 대한 유닛 테스트 코드를 작성하고 실행하니 에러가 나셨을 겁니다. 많은 분들이 영한님의 Spring Data JPA 강의를 수강 후, 프로젝트 시작 시에 만들어지는 Applicaiton 파일에 붙여둔 @EnableJpaAuditing 어노테이션 때문에 에러가 나게 되는 겁니다. 어째서냐? 원인 Using this annotation will disable full auto-configuration and instead apply only configuration relevant to MVC tests (i.e. @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, F..
2023.10.31