6.1 静的メソッドmockStatic()のモック化
そしてもう 1 つの重要な点は、静的メソッドのモックと検証です。「それの何が問題なの?」とあなたは尋ねます。はい、静的ですが、メソッドは同じです。そしてあなたは間違っているでしょう。
モック オブジェクトについてどこから学び始めたか覚えていますか? これらのオブジェクトは、 を通じて人工的に作成されるためですDynamicProxy
。また、静的メソッドはどのオブジェクトにもバインドされていないため、を介して静的メソッドへの呼び出しをインターセプトDynamicProxy
することはできません。それで全部です。
しかし、Mockito の作成者はここでも回避することができました。彼らは独自のクラス ローダーを作成し、その助けを借りてその場でクラスを置き換えることができました。大きくて難しい仕事でしたが、それでも彼らはやり遂げることができました。
追加のライブラリを以下に追加する必要がありますpom.xml
。
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
静的メソッドをモックする必要がある場合の作業方法は次のとおりです。
1 特別なモック クラス オブジェクトを作成します。
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 このオブジェクトに操作ルールを追加します。
この規則の目的に対しては、別の方法で固執する必要があります。
managerObject.when(ClassName::method name).thenReturn(result);
3オブジェクトがすぐに削除され、Mockito がそれに関連付けられたルールをクリアできるように、必ずこのオブジェクトの使用をラップしてください。try-with-resources
例:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
@Mock
注釈やほど美しくはありません@Spy
が、非常に実用的です。テスト対象のメソッド内で使用される単純な静的メソッドをモックすることができない場合、テストを作成するのは非常に困難でした。
GO TO FULL VERSION