6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JUnitでthrows Exceptionしないのは人道に反する

Last updated at Posted at 2021-10-01

こういうのやめてほしいんです。疲れました。

@Test
public void testMethod_001 () {
    try {
        Foo foo = new Foo();
        Object result = foo.method();
        assertEquals(0, result);
    } catch (Exception e) {
        // ★☆★なんでこういうことするの★☆★
        e.printStackTrace();
        fail("テスト実行時に例外が発生しました");
    }
}

単体テストがどうあるべきかとか、日常生活の中で考えたりしないんですかね?
メンテナンス不能です。こんなの。

コンソール出力を見ないとどこで例外が起きたかわかりません。
どこの現場に行っても、何回指導しても直らなくてうんざりしています。誰かがそういう風に教育しているなら改めてほしいです。

そもそも、単体テストの結果って3通りあると思うんです。

  • 成功 … 正しく動いた
  • 失敗 … 動いたけど結果が正しくない
  • 例外 … そもそも動かない

失敗と例外は別物です。この2つを丸めてはいけません。例外は例外として通知しましょう。
テストケースが例外を投げたらレポートにもちゃんと例外の詳細が出力されるので、わざわざ Exception#printStackTrace() なんかせずにJUnitに任せてしまうべきです。

ということで、ちゃんと例外を通知するならこうです。

@Test
public void testMethod () throws Exception {  // throws句を足した
    Foo foo = new Foo();
    Object result = foo.method();
    assertEquals(0, result);
}

もちろん、 Foo#method() が検査例外を返さないのであれば throws Exception 無しでもいいです。何でもかんでも trycatch するなって話です。

例外が発生することをテストしたいなら trycatch してくれて構いませんが、ここもやはり最小限とすべきでしょうね。

@Test
public void testMethod_001 throws Exception () {
    Foo foo = new Foo();
    try {
        Object result = foo.method();

        // 例外が発生していないので失敗
        fail(result);
    } catch (FooException e) {  // 何でもかんでもcatchしない
        assertEquals("E001", e.getErrorCode());
        assertEquals("氏名が入力されていません", e.getErrorMessage());
    }
}
6
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?