티스토리 뷰

카테고리 없음

Mock Object만드는 방법

KyeongRok Kim 2022. 6. 7. 15:50

 

Mock이란?

Mock은 모의, 가짜의 란 뜻 입니다.

Mock Test는 가짜 객체를 사용해서 테스트 하는 방법입니다.

 

Mock을 쓰는 이유

예를들어 User라는 Object는 DB에서 값을 불러와서 만들어집니다. 그런데 DB를 연동해서 Test를 하려면 DB컨넥션 맺어야 하고 Jpa의 경우는 Object들을 모두 생성해야 하기 때문에 시간이 오래걸립니다. 그래서 Mock을 씁니다.

 

given을 쓰는 경우

@ExtendWith(MockitoExtension.class)
class MockTest {

	@Mock
	private RecordingService recordingService;

	@Test
	@DisplayName("given일때 어떤 object를 리턴할지 정하기")
	void givenTest(){
		given(recordingService.get(0l)).willReturn(Optional.of(new Recording(0l, "mock recording object")));
		Optional<Recording> recording = recordingService.get(0l);
		Assertions.assertEquals("mock recording object", recording.get().getTitle());
	}

}

 

doReturn을 쓰는 경우

아래 코드는 recordingService.list() 를 호출하면 recordings()의 리턴값을 리턴해준다는 뜻 입니다.

private List<Recording> recordings(){
    List<Recordings> recordings = new ArrayList<>();
    recordings.add(new Recording(0l, "first recording"));
    recordings.add(new Recording(1l, "second recording"));
    recordings.add(new Recording(2l, "third recording"));
}


@Test
void controllerTest(){
    doReturn(recordings()).when(recordingService).list();
    List<Recording> recordings = recordingService.list();
    Assertions.assertEquals("first recording", recordings.get(0).getTitle());
}

 

ControllerTest

@ExtendWith(MokitoExtension.class)
class RecordingServiceMockTest {

    @Mock
    private RecordingService recordingService; // Mock오브젝트 생성

    @InjectMocks
    private RecordingController recordingController; // @Mock어노테이션 붙은 오브젝트를 넣어줍니다

    private MockMvc mockMvc;

    @BeforeEach
    public void init() {
    	mockMvc = MockMvcBuilders.standaloneSetup(recordingController).build();
    }

    private List<Recording> recordings() {
        List<Recording> recordings = new ArrayList<>();
        recordings.add(new Recording(0l, "first recording"));
        recordings.add(new Recording(1l, "second recording"));
        recordings.add(new Recording(2l, "third recording"));
        return recordings;
    }

    @Test
    @DisplayName("controller test")
    void controllerTest() throws Exception {
    	doReturn(recordings()).when(recordingService).list();

        ResultActions resultActions = mockMvc.perform(
            MockMvcRequestBuilders.get("/api/v1/recording1/list")
        );
        MvcResult mvcResult = resultActions.andExpect(status().isOk()).andReturn();
        Assertions.assertEquals("[{\"id\":0", mvcResult.getResponse().getContentAsString().substring(0, 8));
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함