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

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

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

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

モック

モックとは、テスト対象の間接出力が正しいことを確認するためのもの。テスト対象のメソッドが相互に動作するための環境を提供する。インスタンスはテスト用に生成された専用の環境の中で動作する。

Java

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

Q&A

解決済

1回答

7570閲覧

継承元の親クラスのメソッドのモック化方法

kurotn

総合スコア7

JUnit

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

モック

モックとは、テスト対象の間接出力が正しいことを確認するためのもの。テスト対象のメソッドが相互に動作するための環境を提供する。インスタンスはテスト用に生成された専用の環境の中で動作する。

Java

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

1グッド

0クリップ

投稿2019/03/07 15:19

実現したいこと

親クラスのメソッドの戻り値を置き換えたい。

詳細

Javaにて、Mockito2.8.9+PowerMock1.7.1を利用して以下のようなクラスのテストコードを作成しています。

public class Parent { public int save() { return 99; } } public class Child extends Parent { public int save() { int i = super.save(); return i*2; } }

PowerMockitoのsuppressメソッドを以下のように利用することで、saveメソッドを無効化することまでは確認できています。

Method replaceMethod = Parent.class.getMethod("save"); PowerMockito.suppress(replaceMethod); new Child.save() // return=0

上記を踏まえて、親クラスのsaveメソッドをreplaceメソッドを利用して、以下のような形で置き換えを実行しようとしていますが上手く動作しません。

Method replaceMethod = Parent.class.getMethod("save"); replace(replaceMethod).with( new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("replaceMethod!!"); // not print return 1; } } ); new Child().save(); // return=198

いくつか情報サイトも確認してみましたが、どれも上手く行かない状況です。
上記のreplaceメソッドが正しく動く方法を教えてください。

なお、そもそも親クラスのメソッドを呼ぶような実装が悪いのはその通りなのですが、テスト対象のコードは変更できない状況なので、なんとか置き換えを行いたい状況です。

kopazujidora👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

new するんじゃなくてoverrideしましょう(ってことかな?

Java の @Override って何だ

投稿2019/03/07 22:30

y_waiwai

総合スコア87749

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

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

kurotn

2019/03/08 01:33 編集

回答有難うございます。 あまりまだ動きがよく理解はできていませんが、メソッドをChildクラスから取得することで、想定していた動きとなることを確認することができました。 Method replaceMethod = Child.class.getMethod("save"); // Parent -> Child へと変更。 replace(replaceMethod).with( new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("replaceMethod!!"); // not print return 1; } } ); new Child().save(); // return=2
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問