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

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

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

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

Java

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

Q&A

解決済

2回答

56258閲覧

[JUnit] 戻り値のないvoidメソッドはテストする必要はあるのか?

k499778

総合スコア599

JUnit

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

Java

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

0グッド

2クリップ

投稿2015/10/18 10:16

現在JUnitについて勉強しています。

質問があるのですが、
結論から言うと、

戻り値のないvoidメソッドはテストする必要はあるのでしょうか?
もしする必要があればどのようなテストを書けば良いでしょうか?

今過去に自分が書いたプロダクトコードのテストコードを書いてみようと思考錯誤しています。
例えば下記のようなSampleクラスのmethメソッドはどのようなテストコードが書けるでしょうか?
あるいはテストコードを書く必要はないのでしょうか?

Java

1public class Sample 2{ 3 String name = "Sugai"; // Member Variable 4 5 void meth() 6 { 7 String name = "Tochihara"; 8 System.out.println(this.name); // 何が出力されますか? 9 } 10 public static void main(String[] args) 11 { 12 Sample d=new Sample(); 13 d.meth(); 14 } 15 16}

テストの意図としてはこのような感じになるのかなと思って書いています。

Java

1public class SampleTest { 2 3 @Test 4 public void testEqual() { 5 Sample d = new Sample(); 6 assertEquals("Sugai", d.meth()); //コンパイルエラー 7 8 } 9 10}

しかし戻り値がないのでassertEqualsメソッドが使えなくて困っています。当たり前ですが。。
どなたかアドバイスいただけるとありがたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

返り値が void メソッドでもテストする項目はいろいろあります。

  1. メソッド呼び出しの副作用の内容を確認する。

(System.out.println の内容や log 出力内容をテストする)
2. excepiton が発生する条件をテストする。

参考情報:

↓では System.out.println の内容と例外発生の条件をテストしてみています。
(例外発生のテストの為に meth2(String[]) というメソッドも追加定義しています)

Sample2.java

java

1public class Sample2 { 2 String name = "Sugai"; // Member Variable 3 4 void meth() { 5 String name = "Tochihara"; 6 System.out.println(this.name); // 何が出力されますか? 7 } 8 9 void meth2(String[] args) { 10 if (args.length == 0) { 11 throw new IllegalArgumentException("args.length == 0"); 12 } 13 System.out.println(this.name + " " + args[0]); 14 } 15 16 public static void main(String[] args) { 17 Sample2 d = new Sample2(); 18 d.meth(); 19 d.meth2(args); 20 }

Sample2Test.java

java

1import static org.junit.Assert.assertEquals; 2import static org.junit.Assert.assertTrue; 3import static org.junit.Assert.fail; 4 5import java.io.ByteArrayOutputStream; 6import java.io.PrintStream; 7 8import org.junit.After; 9import org.junit.Before; 10import org.junit.Test; 11 12public class Sample2Test { 13 14 private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); 15 private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); 16 17 @Before 18 public void setUpStreams() { 19 System.setOut(new PrintStream(outContent)); 20 System.setErr(new PrintStream(errContent)); 21 } 22 23 @After 24 public void cleanUpStreams() { 25 System.setOut(null); 26 System.setErr(null); 27 } 28 29 @Test 30 public void testMath() { 31 Sample2 s2 = new Sample2(); 32 s2.meth(); 33 assertEquals("Sugai\n", outContent.toString()); 34 } 35 36 @Test 37 public void testMath2WithNull() { 38 try { 39 Sample2 s2 = new Sample2(); 40 s2.meth2(null); 41 fail(); 42 } catch (NullPointerException e) { 43 assertTrue(true); 44 } 45 } 46 47 @Test 48 public void testMath2WithNEmpty() { 49 try { 50 Sample2 s2 = new Sample2(); 51 String[] args = {}; 52 s2.meth2(args); 53 fail(); 54 } catch (IllegalArgumentException e) { 55 assertEquals("args.length == 0", e.getMessage()); 56 } 57 } 58 59 @Test 60 public void testMath2() { 61 Sample2 s2 = new Sample2(); 62 String[] args = { "xxx" }; 63 s2.meth2(args); 64 } 65 66 @Test 67 public void testMain() { 68 try { 69 Sample2.main(null); 70 fail(); 71 } catch (NullPointerException e) { 72 assertTrue(true); 73 } 74 } 75}

eclipse で unit test を実行させたときのスクリーンショット:
イメージ説明

投稿2015/10/18 11:42

katoy

総合スコア22324

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

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

k499778

2015/10/18 12:05

katoyさん 回答ありがとうございます。 丁寧でわかりやすく大変参考になります。 1つ質問なのですが、 testMath2メソッドにはassertEqualsのようなtrue,falseを判定するメソッドはいらないのでしょうか? 確かにargs変数の中身をnullにすると例外が発生しテストに失敗するので、正常に処理が流れること自体がテスト成功という意味でとくにtrue,falseを判定するメソッドは必要ないのかなとも思ったのですが。 初歩的な質問で申し訳ないのですが、もしよろしければお答えください。
katoy

2015/10/18 15:20

> testMath2メソッドにはassertEqualsのようなtrue,falseを判定するメソッドはいらないのでしょうか? assert 文を書き忘れていました。 stdout への出力内容を確認する assert を書くべきでした。
k499778

2015/10/18 23:11 編集

返答ありがとうございます。 承知しました。
k499778

2015/10/19 15:07

katoyさん もうお気づきにならないかもしれませんが、 testMath2メソッドはどういう書き方になるでしょうか? 厚かましいお願いだとは思いますが、もしお時間ございましたらお答え頂けると嬉しいです。
eripong

2015/10/19 15:13

assertEquals("Sugai xxx\n", outContent.toString()); だと思います。
katoy

2015/10/19 15:18

↑: はい、そうです。
k499778

2015/10/20 13:54

eripongさん、katoyさん 返答ありがとうございます。 スッキリ解決することができました。ありがとうございます!
k499778

2015/10/21 14:30

katoyさん EclEmmaプラグイン導入しました。 いいですねこれ。カバレッジ見れるのもそうですが、 テストされていないコードが赤くなるのがわかりやすくていいなと思いました。
k499778

2015/10/21 22:41

katoyさん ありがとうございます。参考にします。
guest

0

標準出力をテストする方法はそのものずばりがありました。
参考: 標準出力に結果を出すプログラムをJUnit 4.1でテストする方法

ですが、標準出力を使っていない場合はメソッドの処理によって何をテストするのか考える事になり、一般的な方法はありません。
たとえば、setterで設定するインスタンスの挙動をテストの時だけ変更したいのならJMockitが便利です。
参考: JMockit使い方メモ

投稿2015/10/18 10:39

shiena

総合スコア1825

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

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

k499778

2015/10/18 12:06

shienaさん 回答ありがとうございます。 大変参考になります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問