Skip to content

Commit

Permalink
[이슈] - #6
Browse files Browse the repository at this point in the history
[내용] - testcase 작성
  • Loading branch information
lima1016 committed Feb 8, 2025
1 parent 804e1a0 commit d36f572
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void execute(JobExecutionContext context) {
}
}

private void connectIntraDayHttp(JobExecutionContext context, HttpUrl.Builder url) {
public void connectIntraDayHttp(JobExecutionContext context, HttpUrl.Builder url) {
HttpUrl httpUrl = url.build();
try(Response response = connection.getOkHttpClient().newCall(new Request.Builder().url(httpUrl).build()).execute()) {
if (response.isSuccessful()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package com.lima.consoleservice.schedule.log;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.lima.consoleservice.config.OkHttpClientConnection;
import com.lima.consoleservice.schedule.log.params.Symbol;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.io.IOException;
import okhttp3.HttpUrl.Builder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.quartz.JobExecutionContext;
import org.springframework.boot.test.context.SpringBootTest;
import okhttp3.HttpUrl.Builder;
import org.springframework.test.util.ReflectionTestUtils;

@SpringBootTest
Expand All @@ -31,30 +31,31 @@ class TimeSeriesIntraDayLogTest {
@InjectMocks
private TimeSeriesIntraDayLog job;

@Mock
private JobExecutionContext context;

@BeforeEach
void setUp() {
// 테스트 실행 전에 @Mock으로 선언된 객체들을 자동으로 생성하고 초기화하는 작업임
MockitoAnnotations.openMocks(this);
}

// TimeSeriesIntraDayLog 에 connection 필드는 private final 이여서 생성자에서 직접 초기화 해야한다.
// 테스트 코드에서 new TimeSeriesIntraDayLog(); 를 호출하면 내부적으로 진짜 객체를 가져와버린다.
// 강제로 필드 값을 바꾸기 위해서 ReflectionTestUtils.setField()를 사용한다.
// 원래는 setter 메서드를 사용해야 한다. private final로 되어있어서 리플랙션 사용.

@Test
void executeConnectAPI() {
// Given
// mock() 로 가짜 객체를 만들어서 메서드 호출을 검증할 수 있게 할 수 있다.
JobExecutionContext context = mock(JobExecutionContext.class);

// TimeSeriesIntraDayLog 에 connection 필드는 private final 이여서 생성자에서 직접 초기화 해야한다.
// 테스트 코드에서 new TimeSeriesIntraDayLog(); 를 호출하면 내부적으로 진짜 객체를 가져와버린다.
// 강제로 필드 값을 바꾸기 위해서 ReflectionTestUtils.setField()를 사용한다.
// 원래는 setter 메서드를 사용해야 한다. private final로 되어있어서 리플랙션 사용.
ReflectionTestUtils.setField(job, "connection", connection);

Builder mockBuilder = mock(Builder.class);

// When
// 여기서 buildParameters()의 반환값을 설정
when(connection.buildParameters()).thenReturn(mockBuilder);
// addQueryParameter도 mock 처리
when(mockBuilder.addQueryParameter(anyString(), anyString())).thenReturn(mockBuilder);

job.execute(context);
Expand All @@ -63,4 +64,33 @@ void executeConnectAPI() {
// buildParameters()가 Symbol 개수만큼 호출되었는지 검증
verify(connection, times(Symbol.values().length)).buildParameters();
}

// doAnswer()는 메소드의 실행을 커스터마이징 하기위해 사용하는 메소드 이다.
// void 반환 타입을 가진 메소드에서 사용된다.
// spy()는 부분적으로 모의 객체를 만들 때 사용하는 메소드이다.
// mock()는 전체 객체를 가짜로 만들지만, spy()는 실제 객체를 감싸서 일부 메소드만 가짜로 만들 수 있다.
@Test
void executeWithIOException() {
// Given
ReflectionTestUtils.setField(job, "connection", connection);
Builder mockBuilder = mock(Builder.class);

when(connection.buildParameters()).thenReturn(mockBuilder);
when(mockBuilder.addQueryParameter(anyString(), anyString())).thenReturn(mockBuilder);

// spyJob은 TimeSeriesIntraDayLog의 스파이 객체로, connectIntraDayHttp() 메소드가 실제로 호출되었는지, 몇 번 호출되었는지를 검증한다.
TimeSeriesIntraDayLog spyJob = spy(job);

doAnswer(invocation -> {
throw new IOException("Test Exception");
}).when(spyJob).connectIntraDayHttp(any(), any());

// When
spyJob.execute(context);

// Then
verify(connection, times(Symbol.values().length)).buildParameters();
// any(), any()는 connectIntraDayHttp() 메소드에 전달된 인자들에 대해 특정 값이 아니라 인자 값이 무엇이든 상관없다는 의미로 사용된다.
verify(spyJob, times(Symbol.values().length)).connectIntraDayHttp(any(), any());
}
}

0 comments on commit d36f572

Please sign in to comment.