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

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

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

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

Java

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

Q&A

解決済

1回答

5923閲覧

privateメソッドをmock化してexceptionを発生させたい

g1081828

総合スコア8

JUnit

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

Java

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

0グッド

1クリップ

投稿2019/08/31 12:55

前提・実現したいこと

テスト対象クラスのprivateメソッドがExceptionをthrowするのですが、
テストでExceptionを発生させるのが難しいです。
そのため、当該クラスのprivateメソッドのみを部分的にmock化して、
そのmock化したメソッドが呼ばれたらExceptionをthrowさせるようにしたいです。
そもそも当該事項を実現させるのは無理なでしょうか?
テストツールはJmockitにこだわるつもりはないです。
困っています。お知恵をお貸しください。

該当のソースコード

java

1import org.apache.logging.log4j.LogManager; 2import org.apache.logging.log4j.Logger; 3 4public class LogUtil { 5 6 //コンストラクタ 7 public LogUtil() {} 8 9 public int outPutLog(String logLevel,String msg) { 10 11 //処理結果 12 int rc = 0; 13 14 try { 15 //loggerの取得 16 Logger logger = LogManager.getLogger("hoge"); 17 18 //ログ出力 19 this.write(logger, logLevel, msg); 20 21 return rc; 22 23 }catch(Throwable T) { 24 return rc = 9; 25 } 26 } 27 28 private void write(Logger logger, String logLevel, String msg) throws Throwable { 29 switch(logLevel) { 30 case "D": 31 logger.debug(msg); 32 break; 33 case "I": 34 logger.info(msg); 35 break; 36 case "W": 37 logger.warn(msg); 38 break; 39 case "E": 40 logger.error(msg); 41 break; 42 } 43 } 44}

試したこと

Jmockitでやったのですが、方法がわかりませんでした。

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

Jmockit 1.47

バージョンにはこだわりません。
Jmockitにもこだわりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

privateなメソッドじゃなくて、Loggerをモックにすればいいだけでは。

LoggerインスタンスがoutPutLogメソッド呼び出し時に毎度生成される作りをやめて(例えばコンストラクタで初期化されるようにして)、依存性の注入でモックに差し替えられればテストできると思います。

一番簡単なのはテスト用にコンストラクタを別途作って、モックオブジェクトを使ってフィールドにしたLoggerを初期化する方法(コンストラクタインジェクション)ですが。(実コードから使う引数なしのコンストラクタでは普通にLoggerのフィールドを今までどおりのクラスで初期化する)

投稿2019/08/31 18:02

gentaro

総合スコア8947

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問