質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

0回答

1694閲覧

Mockito+PowerMockでテスト対象クラスのsuperクラスのメソッドをモック、さらにテスト対象クラスのメソッド呼び出し回数を確認する方法

taketake08

総合スコア16

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2022/08/27 14:50

実現したいこと

Mock+PowerMockを使用して、以下の2点を確認したい。
①テスト対象クラスの親クラスが呼び出している"super.~"をspyして任意の値を返しように設定したい。
②テスト対象クラスをspyして、テスト対象クラスのメソッドの呼び出し回数を確認したい。

発生している問題・エラーメッセージ

実現したいこと①を確認可能なテストコードとすると②が確認できなくなり、
実現したいこと②を確認可能なテストコードとすると①が確認できなくなる。

該当のソースコード

★AbsAクラス

Java

1public abstract class AbsA { 2 public String getHoge() { 3 return "Hoge"; 4 } 5}

★AbsBクラス

Java

1public abstract class AbsB extends AbsA{ 2 public String getFugaHoge() { 3 return "Fuga" + super.getHoge(); 4 } 5}

★テストスタブクラス

Java

1public class Stub extends AbsB { 2 public void doHoge() {} 3}

★テストクラス(①が確認可能だが②が確認できない)

Java

1@PrepareForTest({AbsA.class}) 2@RunWith(PowerMockRunner.class) 3public class AbsATest { 4 5 @Test 6 public void test() throws Exception { 7 8 Stub stub = new Stub(); 9 stub.doHoge(); 10 11     // super.~の戻り値設定 12 Method method = AbsA.class.getMethod("getHoge"); 13 PowerMockito.replace(method).with( 14 new InvocationHandler() { 15 @Override 16 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 17 return "Fuga"; 18 } 19 }); 20 21 // 実現したいこと① 22 assertEquals("FugaFuga", stub.getFugaHoge()); 23 // 実現したいこと② 24 Mockito.verify(stub, times(1)).doHoge(); 25 } 26 27}

★テストクラス(②が確認可能だが①が確認できない)

Java

1@PrepareForTest({AbsA.class}) 2@RunWith(PowerMockRunner.class) 3public class AbsATest { 4 5 @Test 6 public void test() throws Exception { 7 8 Stub stub = PowerMockito.spy(new Stub()); 9 stub.doHoge(); 10 11     // super.~の戻り値設定 12 Method method = AbsA.class.getMethod("getHoge"); 13 PowerMockito.replace(method).with( 14 new InvocationHandler() { 15 @Override 16 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 17 return "Fuga"; 18 } 19 }); 20 21 // 実現したいこと① 22 assertEquals("FugaFuga", stub.getFugaHoge()); 23 // 実現したいこと② 24 Mockito.verify(stub, times(1)).doHoge(); 25 } 26 27}

上記では、
Stub stub = new Stub();でテスト対象はspyしないか、
Stub stub = PowerMockito.spy(new Stub());でテスト対象をspyするかが異なる。

spyしなければ当然呼び出し回数の確認は行えないが、
spyするとsuper.~の戻り値を設定している部分が動作しなくなる。

参考サイト

★Mockitoの最低限な使い方
https://qiita.com/fumu238/items/64c910bc36b051c6b976

★PowerMockでsuperメソッド呼び出しをモックする方法
https://qiita.com/junn8k/items/9a2cc8ade20b73d6239a

補足情報(FW/ツールのバージョンなど)

■Junit
・JUnit4

■Mockito
・mockito-all-1.10.19.jar

■PowerMock
・powermock-mockito-release-full-1.6.2-full.jar

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問