Search
Duplicate

[스프링 게시판] 테스트 코드 작성

@3/8/2023

DB Dialect 에러

테스트 코드를 작성하고 돌리는데 Table 'springforumdb.user' doesn't exist 라면서 오류 발생함
생각해보니 테스트 폴더에 설정파일이 누락돼있었음
설정파일을 일단 복붙해서 돌리니 다음 에러가 남
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " create table comment ( comment_id bigint not null auto_increment, content varchar(255), reg_date datetime, post_id bigint, user_id bigint, primary key (comment_id) ) type=MyISAM" via JDBC Statement ... Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=MyISAM' at line 8
Plain Text
복사
db type이 MyISAM으로 나가는 게 문제인가 봄
DDL을 MySQL 벤치로 옮겨보니 type=MyISAM 자체가 비문이라고 함
찾아보니 세 가지 Dialect을 테스트 해보라고 함
MySQL8Dialect
MySQLMyISAMDialect
MySQLInnoDBDialect
MySQL8Dialect 로 바꿔보니 잘 됨. @Transactional 주석처리하니 DB에 테이블도 잘 만들어짐

getSingleResult()의 NoResultException 문제

UserService 클래스의 join 메서드 중복 제거 부분에서 아래 오류가 남
No entity found for query
if (userRepository.findByName(userForm.getName()).isPresent()) { throw new IllegalStateException("이미 존재하는 회원입니다"); }
Java
복사
보니까 UserRepository에서
public Optional<User> findByName(String name) { return Optional.ofNullable( em.createQuery("select u from User u where u.name = :name", User.class) .setParameter("name", name) .getSingleResult()); }
Java
복사
getSingleResult()를 한 부분이 문제였음. 얘는 결과가 없으면 NoResultException을 터뜨려서 논란이 많은 아이임. 이를 getResultSet()으로 고쳐서 결과가 없더라도 예외가 나지 않도록 수정함
d9d4820ae05e6ff2098939ddf37389fa1dc24516
commit
해보니 getResultSet()은 결과가 없으면 null이 아니라 빈 리스트를 반환함( 참조).

람다식 → 람다 표현식

IDE가 람다식을 바꾸는걸 자꾸 추천해주길래 바꿔봄
Assertions.assertThrows(IllegalStateException.class, () -> { userService.findUser(foundUser.getId()); });
Java
복사
Assertions.assertThrows(IllegalStateException.class, () -> userService.findUser(foundUser.getId()));
Java
복사
위처럼 바뀌는데, 개인적으로 중괄호를 좋아하기 때문에 그냥 원복함

테스트 코드 커밋