[解決済み] Mockito - メソッドのスタブ時にNullpointerExceptionが発生する。
質問
そこで私は、Java-Springプロジェクトのテストを書き始めました。
使っているのはJUnitとMockitoです。when()...thenReturn()オプションを使うと、サービスをシミュレートせずにモック化できるらしい。そこで、私がしたいことは、設定することです。
when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)
しかし、どのwhen-clauseを実行しても、いつもNullpointerExceptionが発生します。もちろん、inputがnullなので、それは理にかなっています。
また、あるオブジェクトから別のメソッドをモックしようとしたとき。
when(object.method()).thenReturn(true)
メソッドが変数を必要とし、それが設定されていないため、そこでもNullpointerを取得します。
しかし、この変数の作成などを回避するために when().thenReturn() を使いたいのです。どのクラスがこのメソッドを呼び出しても、何があってもtrueか上記のリストを返すようにしたいだけなのです。
私の基本的な誤解なのか、それとも他に何か問題があるのでしょうか?
コードです。
public class classIWantToTest implements classIWantToTestFacade{
@Autowired
private SomeService myService;
@Override
public Optional<OutputData> getInformations(final InputData inputData) {
final Optional<OutputData> data = myService.getListWithData(inputData);
if (data.isPresent()) {
final List<ItemData> allData = data.get().getItemDatas();
//do something with the data and allData
return data;
}
return Optional.absent();
}
}
そして、これが私のテストクラスです。
public class Test {
private InputData inputdata;
private ClassUnderTest classUnderTest;
final List<ItemData> allData = new ArrayList<ItemData>();
@Mock
private DeliveryItemData item1;
@Mock
private DeliveryItemData item2;
@Mock
private SomeService myService;
@Before
public void setUp() throws Exception {
classUnderTest = new ClassUnderTest();
myService = mock(myService.class);
classUnderTest.setService(myService);
item1 = mock(DeliveryItemData.class);
item2 = mock(DeliveryItemData.class);
}
@Test
public void test_sort() {
createData();
when(myService.getListWithData(inputdata).get().getItemDatas());
when(item1.hasSomething()).thenReturn(true);
when(item2.hasSomething()).thenReturn(false);
}
public void createData() {
item1.setSomeValue("val");
item2.setSomeOtherValue("test");
item2.setSomeValue("val");
item2.setSomeOtherValue("value");
allData.add(item1);
allData.add(item2);
}
解決方法は?
まだスタブしていないメソッドのデフォルトの戻り値は
false
はブーリアンメソッド、コレクションやマップを返すメソッドは空のコレクションやマップ、そして
null
それ以外の場合は
内のメソッド呼び出しにも適用されます。
when(...)
. この例では
when(myService.getListWithData(inputData).get())
はNullPointerExceptionを引き起こします。
myService.getListWithData(inputData)
は
null
- は、以前にスタブされたことがない。
ひとつの方法として、すべての中間返り値に対してモックを作成し、使用前にスタブしておくという方法があります。例えば
ListWithData listWithData = mock(ListWithData.class);
when(listWithData.get()).thenReturn(item1);
when(myService.getListWithData()).thenReturn(listWithData);
あるいは、モックを作成する際に別のデフォルトアンサーを指定し、 メソッドが null ではなく新しいモックを返すようにすることもできます。
RETURNS_DEEP_STUBS
SomeService myService = mock(SomeService.class, Mockito.RETURNS_DEEP_STUBS);
when(myService.getListWithData().get()).thenReturn(item1);
のJavadocを読む必要があります。 Mockito.RETURNS_DEEP_STUBS には、より詳細な説明と使用上の警告が書かれています。
お役に立てれば幸いです。ただ、あなたのサンプルコードには、assertやverify文が抜けていたり、モック上でセッターを呼び出している(これは何の効果もない)など、さらに問題があるようなので注意してください。
関連
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] モックされたメソッドに渡された引数を返すようにする
-
[解決済み] Mockitoを使用して特定のメソッドが呼び出されていないことを確認するにはどうすればよいですか?
-
[解決済み] Mockitoは複数回呼び出されたメソッドの引数をキャプチャできますか?
-
[解決済み] voidメソッドが例外を投げるかどうかをMockitoがテストする
-
[解決済み] モッキート メソッドをスパイしようとすると、元のメソッドが呼び出される
-
[解決済み] Mockito : メソッド内で生成されたオブジェクトでメソッドが呼び出されたことを確認する方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Javaを使用するSelenium - ドライバの実行ファイルのパスは、webdriver.gecko.driverシステムプロパティで設定する必要があります。
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である