해결된 질문
작성
·
642
1
MemoryMemberRepository와 MemoryMemberRepositoryTest입니다.
MemoryMemberRepository에 clearStore()메서드 추가했고, MemoryMemberRepositoryTest에 afterEach()를 추가하였는데도 findByName()에서 에러가납니다.
이유가 궁금합니다.
감사합니다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>(); //save할때 저장할 곳
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
// id는 시퀀스++해서 넣고 name은 Member클래스보면 회원이 직접 입력한 name인것임. 따라서 이 2개 정보가 저장됨
store.put(member.getId(),member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
// optional.ofNullable 통해 null들어와도 감싸며반환
// 이렇게 반환하면 클라이언트가 활용할수있음.
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream() // *람다식.. store에서 루프돌면서
.filter(member -> member.getName().equals(name)) // getName해서 루프에서 name찾은거랑, .equals(name)해서 파라미터 name이랑 같은지 확인.
.findAny(); //하나라도 찾으면 반환.
// 그리고 이 결과가 Optional반환이므로 끝까지 돌려도 없으면 null포함되며 반환
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear(); // store를 싹 비워줌
}
}
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.junit.Test;
import org.junit.jupiter.api.AfterEach;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
//테스트 끝날때마다 리포짓토리를 지워주는 메서드(한번에 전체 실행시 에러발생날수 있으므로)
// @AfterEach : 메서드 하나 끝날때마다 동작하도록하는..콜백함수 만들어줌
// 따라서 전체코드 실행시 save() -> afterEach() -> findByName() -> afterEach() ... 이런식으로 동작
@AfterEach
public void afterEach() {
repository.clearStore();
}
@Test
public void save() {
Member member = new Member();
member.setName("spring"); //id는 자동으로 메겨지고 이름은 입력해줘야해서 setName함
repository.save(member);
// save 잘됐는지 확인하기 위해 findById통해서 알아보기.(save할때 member.setId(++sequence) 통해서 id세팅함. 그래서
// findByid통해서 아이디를 통해 저장한거 잘 가져오는지 확인
Member result = repository.findById(member.getId()).get(); // ** get() 사용하는 이유? : optional한번 깐 다음 호출해줌
// member랑 result랑 같은지 확인. 둘다 member도 Member타입이고 result도 MemoryMemberRepository확인하면
// Member타입임을 알수있다.(*public Optional<Member> findById(Long id) {) --> 그래서 비교 가능
assertThat(member).isEqualTo(result); // 둘이 같은지 비교
}
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
List<Member> result = repository.findAll();
assertThat(result.size()).isEqualTo(2);//save를 member1,member2 2개했으니까 size는 2어야..
}
}
답변 2
0
혼자 해결했습니다.
@Test를 import할때
import org.junit.jupiter.api.Test; 이렇게 import해야하는데
import org.junit.Test; 이렇게 작성했더라구요
두개 차이가 궁금한데 제 의견이 맞는지 답변 주실수있을까요..
import org.junit.Test; 는 junit4를 사용하는것이고
import org.junit.jupiter.api.Test;는 jupiter api를 사용하는것인데
MemoryMemberRepositoryTest 클래스의 안에서 사용한 assertThat 구문이
jupiter api로 인해 사용이 가능하기때문에 jupiter api를 사용해야한다..맞나요?
https://junit.org/junit4/javadoc/latest/index.html
https://junit.org/junit5/docs/current/api/
Junit5에서는 패키지가 jupiter, platform, vintage 3개로 구분되어 있습니다. @afterEach는 Junit5 어노테이션이고, junit4에서는 @afterEach가 없네요.
맞는지는 모르겠으나 문서상으로는 그렇네요.