작성
·
906
답변 3
0
public class InMemoryOriginalRepository implements OriginalRepository {
private final Map<Long, TestEntity> entities = new HashMap<>();
private final AtomicLong idGenerator = new AtomicLong(1);
@Override
public BillingPay save(TestEntity entity) {
long id = idGenerator.getAndIncrement();
setPrivateField(entity, "id", id); // 이친구는 리플렉션으로 처리 :)
entities.put(id, entity);
return entity;
}
private void setPrivateField(Object object, String fieldName, Object value) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
이유는 db 에 id 를 자동으로 증가시키는걸 위임해버렸기 때문이죵
그래서 entity 에 setId <- 를 열어주지 않는 이상 계속 null 일꺼에용
이럴땐 고수님들이 얘기하는 리플렉션을 조져주면됩니다
0
안녕하세요. 근 한 달이 되어서야 답변을 드리네요. 죄송합니다.
그런데 오래 기다리신 것과는 별개로 제가 질문 상황이 정확히 어떤 상황인지 이해가 되지 않아 답변하기 곤란하네요.ㅠ ‘id를 자동 매핑으로 해놔서 실제 fake로 테스트할 때 id 값을 넣어줄 수 없다’라는 말이 이해가 잘 안 됩니다. id를 자동 매핑으로 해놨기 때문에 발생할 수 있는 테스트하기 어려운 상황은 어떤 상황이었을까요…?
우선 다른 분들과 마찬가지로 예시 코드가 없으셔서 헷갈리시는 것 같아 아래와 같이 예시를 첨부 링크로 달아뒀습니다.
테스트 강의를 만들면서 만든 레포지토리인데요. 참고가 될 수 있지 않을까 싶습니다.
0
안녕하세요, 인프런 AI 인턴이에요. fake Repository를 테스트하기 위해서는 가짜 데이터를 사용해야 합니다. 실제 유저 엔티티를 사용하면 실제 데이터베이스에 영향을 주게 되기 때문에 운영 환경에서 테스트할 때 문제가 발생할 수 있습니다. 따라서, 실제 유저 엔티티를 사용하지 않고 fake로 생성된 데이터를 사용하는 것이 좋습니다.
id 값을 자동 매핑으로 설정해놨다면, fake로 테스트할 때 실제 id 값을 넣어줄 수 없는 문제가 발생할 수 있습니다. 이 경우에는 다른 방법으로 id 값을 설정해주어야 합니다. 예를 들어, 가짜 데이터에 일련번호 또는 랜덤한 값을 부여하여 id 값을 할당하는 방법이 있습니다.
또는, 가짜 Repository 또는 Mock Repository를 사용하여 테스트를 진행할 수도 있습니다. 가짜 Repository를 사용하면 가짜 데이터를 사용하여 테스트를 진행할 수 있고, Mock Repository를 사용하면 원하는 데이터를 조작하여 테스트를 진행할 수 있습니다.
따라서, fake로 테스트할 때 id 값을 넣어줄 수 없는 문제를 해결하기 위해서 새로 Fake에 적용될 유저 도메인을 작성하고, 필요한 가짜 데이터를 사용하여 테스트를 진행하는 것이 좋을 것 같아요. 이렇게 하면 실제 데이터를 사용하지 않고도 테스트를 진행할 수 있고, id 값을 원하는 방식으로 설정하여 사용할 수 있을 거예요.
요청하신 내용이 도움이 되셨길 바라며, 추가로 궁금한 점이 있으시면 언제든지 물어보세요. 감사합니다!
아 제 의도가 제대로 전달되지 않았던 것 같습니다.. 제가 엔티티 생성자에 id 값을 주지 않는데 (실제 DB는 id값을 자동으로 매핑 해주기 때문에 id값을 넣지 않았습니다.) 이게 Fake Repo를 작성하면 문제가 생겨서 어떻게 생성자를 작성하시는지 궁금해서 질문드렸습니다. @Builder를 사용하면 되는군요..