🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

ソフトウェアテスト

ソフトウェアテストは、プログラムを実行し、要求通りに正しく動作が行えているかどうか確認する作業です。プログラム中のバグをできる限り多く発見することを目標として行われます。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

解決済

1回答

3968閲覧

LocalDate.now()を使用しているメソッドのテストの方法

g-p-sd

総合スコア17

Java

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

ソフトウェアテスト

ソフトウェアテストは、プログラムを実行し、要求通りに正しく動作が行えているかどうか確認する作業です。プログラム中のバグをできる限り多く発見することを目標として行われます。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

0クリップ

投稿2019/10/31 02:36

前提・実現したいこと

「本日を含む年から10年間の年を取得する」という機能を持つ
LocalDate.nowを使用したメソッドのテストを作成しているのですが、
下記のようなエラーメッセージが出ました。

発生している問題・エラーメッセージ

org.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'. For example: when(mock.getArticles()).thenReturn(articles); Also, this error might show up because: 1. you stub either of: final/private/equals()/hashCode() methods. Those methods *cannot* be stubbed/verified. Mocking methods declared on non-public parent classes is not supported. 2. inside when() you don't call method on mock but on some other object.

テスト対象のメソッド

Java

1public class ClassificationUtil { 2 public static List<OptionValueText> createYearList() { 3 int currentYear = LocalDate.now().getYear(); 4 List<OptionValueText> resultList = new ArrayList<OptionValueText>(); 5 for (int year = currentYear - 9; year <= currentYear; year++) { 6 resultList.add(new OptionValueText(String.valueOf(year), String.valueOf(year))); 7 } 8 return resultList; 9 } 10}

テストしたいこと

Java

1/** 年月"年"に当年含む過去10年を正しく得られるかをテストしたい */ 2@RunWith(PowerMockRunner.class) 3@PrepareForTest({ClassificationUtil.class, LocalDate.class}) 4@SpringBootTest 5class ClassificationUtilTest { 6 @Test 7 void createYearList() { 8 LocalDate dummy = LocalDate.of(2018, 1, 1); 9 PowerMockito.spy(LocalDate.class); 10 PowerMockito.when(LocalDate.now()).thenReturn(dummy); 11 12 List<OptionValueText> optionValueTextList = ClassificationUtil.createYearList(); 13 14 assertEquals("2009", optionValueTextList.get(0).getValue()); 15 } 16}

試したこと

以前類似の質問があったので、
https://teratail.com/questions/141410
を参考にテストコードを書きましたがエラーになってしまいます。

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

・mockitoを使用した他のメソッドのテストは問題なく動作しています
環境:SpringBoot、Meiven、IntelliJ、Thymeleaf

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

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

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

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

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

guest

回答1

0

ベストアンサー

動作確認環境

  • OpenJDK 11.0.2
  • JUnit 4.12
  • Mockito 2.23.4
  • PowerMock 2.0.4

この環境と下記のテストコードで一応テストは通りました。参考になりますでしょうか。

import static org.junit.Assert.*; import java.time.LocalDate; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest({ClassificationUtil.class}) public class ClassificationUtilTest { @Test public void createYearListTest() { LocalDate dummy = LocalDate.of(2018, 1, 1); PowerMockito.mockStatic(LocalDate.class); PowerMockito.when(LocalDate.now()).thenReturn(dummy); List<OptionValueText> optionValueTextList = ClassificationUtil.createYearList(); assertEquals("2009", optionValueTextList.get(0).getValue()); } }

投稿2019/10/31 14:40

rubytomato

総合スコア1752

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

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

ironya

2019/11/01 00:17 編集

補足的な情報です。 `mockStatic()` を使う場合、 `ClassificationUtil` 内で `LocalDate.now()` の前に `LocalDate.of()` などの処理が動くような時は、 `NullPointerException` にならないように テストクラスで実際のメソッドを呼ぶように定義することも必要です。 ```Java PowerMocito.when(LocalDate.of(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenCallRealMethod(); ``` 念のため。
g-p-sd

2019/11/01 05:07

JUnitのヴァージョンの問題だったようで、JUnit5からJunit4に変更したところ問題なくテストが通りました。ご回答及び補足情報をいただいた方々、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問