【Junit】モックで本物のメソッドを呼ぶ方法
はじめに
お世話になります、hosochinです
今回はJunitでモックしたメソッドについて、本物のメソッドの処理を実行したいときについてです
環境はJunit5系 + Mockito3系です
thenCallRealMethodを使う
thenCallRealMethodを使うと本物のメソッドの処理が実行されます
- テスト対象のクラス
@RestController
@RequiredArgsConstructor
public class SampleController {
private final SampleService service;
public String getSample() {
return service.getStr();
}
}
- モックするクラス
@Service
public class SampleService {
public String getStr() {
return "Real Method";
}
}
- テストクラス
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class SampleControllerTest {
@Mock
private SampleService sampleService;
@InjectMocks
private SampleController target;
@Test
void test() {
when(sampleService.getStr()).thenReturn("Mock Method");
System.out.println(target.getSample()); // Mock Method
when(sampleService.getStr()).thenCallRealMethod();
System.out.println(target.getSample()); // Real Method
}
}
@Spyを使う
もちろんSpyでも同じことができます
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class SampleControllerTest {
@Spy
private SampleService sampleService;
@InjectMocks
private SampleController target;
@Test
void test() {
// 何もモックしない
System.out.println(target.getSample()); // Real Method
// モックする
when(sampleService.getStr()).thenReturn("Mock Method");
System.out.println(target.getSample()); // Mock Method
}
}
ディスカッション
コメント一覧
探してました。
ありがとうございます。
spyの方合ってます?
私が読めてないだけの可能性高いですが。。
コメントありがとうございます!
> spyの方合ってます?
確認しました、コメントで書いたSystem.out.printlnの結果が逆になっていますね、、(というご指摘で良かったでしょうか?)
こちら修正しました、ありがとうございます!