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

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

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

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

Java

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

Q&A

解決済

3回答

7731閲覧

【Java】【単体テスト】Mockオブジェクトを使うか、自力でインスタンスを生成するか

takenyaan

総合スコア119

JUnit

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

Java

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

0グッド

1クリップ

投稿2017/02/21 16:16

JavaでJUnit + Mockito(モックライブラリ)を利用して単体テストを実施しています。
次のようなクラスのメソッドのテストを実装しようと思った場合、ObjectA, ObjectBはモックを利用すべきでしょうか、実際にインスタンスを生成してテストを行うでべきでしょうか。

Java

1public class Hoge { 2 3 public void (ObjectA a, ObjectB b) { 4 // ObjectA, ObjectBを利用して何かしらの処理を行う。 5 } 6}

インスタンス生成が難しいオブジェクトなどは迷わずモックになるのかと思いますが、
自分の中での基準がはっきりとしておらず、なにかしらの判断基準があればご教示いただけますと幸いです。
メソッド内部の処理にも依存しますでしょうか?

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

個人的な意見です。
通常mvcモデルのwebサービスにおいて、異なる階層の場合モックを使いケースが多いです。

例:
ロジック層でDaoオブジェクト(DBアクセス)を行う。

java

1public class Hoge { 2 public HogeDao dao; 3 // テスト対象 4 public void read() { 5 Hoge hoge = dao.read(xx); 6 if (hoge == null) { 7 // do something 8 } else { 9 // do someting else 10 } 11 } 12}

上記の場合、daoはモックを使い、read()メソッドに対して異なる振る舞いを定義する。
daoモックを使わない場合、

  1. dao.read()の結果がnullとnullでない実のテストデータを用意する必要がある。
  2. 1によって、単体テストの意味を超えてしまう。

でもプロジェクトによっては、daoのテストをlogicテストでカーバする(決めの問題)こともあり、
この場合は、mock化してはいけないですね。

本文のObjectAとObjectBも、オブジェクト種類、メソッド内での使い方などを顧慮すべきでしょうね。

投稿2017/02/22 00:26

liguofeng29

総合スコア801

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

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

0

外部システムへのAPI実行や、メール送信など、該当システム内部からの操作では、成功・失敗の意図的な操作や実行結果の切り分けが難しい場合、Mockが登場するかと思います。
DB周り等でも開発しているシステムのものであればDB操作向けテストライブラリなどの導入で対応できるかと思います。

もし、単体テスト内でHTTP通信を外部サーバへシている箇所があれば、そういったところからMockクラスで代替シてはいかがでしょうか。

なおDB周りの単体テストについてはDBSetupがおすすめです。

投稿2018/03/21 16:05

nekt

総合スコア38

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

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

0

UIの本質はメソッド単体の試験なので
基本的にはDIしているオブジェクトなどに対してのみMock化を行うと思います。
出来る限り引数に対してのMockは行いません。が、おっしゃるとおりインタフェースで実装が必要なメソッドがかなり多いなどのインスタンス生成が難しいオブジェクトについてはMock化するしかありません。
その場合は部分Mock化などを検討するべきじゃないですかね。
メソッド内で利用する処理のみはMock化しないなど。

投稿2017/02/22 00:58

7tsuno

総合スコア310

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問