• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

mock postService#write

23.01.01 15:00 작성 23.01.01 15:02 수정 조회수 310

0

안녕하세요 호돌맨님 강의 듣던 도중 mock 으로도 할 수 있다해서 고민해보는중 잘 모르겠어서 질문을 올립니다.

public void write(PostCreate postCreate) {

    Post post = Post.builder()
            .title(postCreate.getTitle())
            .content(postCreate.getContent())
            .build();
    postRepository.save(post);
}

위와 같은 write 메소드를 검증하려면 test 코드에서

posRepostiroy를 mock으로 주입받고 postService.write(postCreate)를 호출시 postRepository.save를 호출할때 어떤 일을 하게 될것이냐 를 stubbing 하려고 하는데

실제 h2 메모리 db에 저장을 해야, 제대로 저장이 되었다는 것을 아래 처럼 검증할 수 있을 것 같은데

Assertions.assertEquals(1L, postRepository.count());

위 write 메소드의 경우 아무것도 return 하지 않으니 save 메소드 stubbing을 어찌 해야할지 모르겠습니다...

 

아니면 접근 자체가 틀렸을까요? 실제 외부와 연동이 잘되는지 확인하는것이니 mock 쓰겠다는 생각 자체가 에러인것인가요?

 

감사합니다.

 

 

답변 1

답변을 작성해보세요.

1

안녕하세요.
질문을 남겨주셔서 감사합니다.

테스틀위해 JpaRepository를 구현하는 MockPostRepository를 만든다고 생각해봅시다.

class MockPostRepository implements JpaRepository<Post, Long> {
    @Override
    public <S extends Post> S save(S entity) {
        return myList.add(entity)
    }

    @Override
    public List<Post> findAll() {
        return ...;
    }

    @Override
    public List<Post> findAll(Sort sort) {
        return ...;
    }

    @Override
    public List<Post> findAllById(Iterable<Long> longs) {
        return ...;
    }

    @Override
    public <S extends Post> List<S> saveAll(Iterable<S> entities) {
        return null;
    }
    ...생략
}

가능은한데 정말 난감하겠지요?..

그러면 실제 스프링 Context를 모두 올리지 않고 Jpa Repository를 알아서 처리해주는 담당자가 있으면 어떨가 생각하게됩니다.

그것이 바로 `@DataJpaTest` 입니다. 관련해서 구글링 해보시면 도움이 될겁니다.

p/s: mocking을 써서 https://stackoverflow.com/a/51258234 이렇게 해결하는 분도 있네요.

감사합니다.