EasyMockでVoidメソッドをモックする

  • link:/category/testing/ [テスト]

  • EasyMock

1. 概要

モックフレームワークは、クラスを分離してテストするために、依存関係との相互作用をモックするために使用されます。 通常、依存関係をモックして、さまざまな値を返します。 このようにして、クラスがこれらの各値を処理できるようにします。
ただし、何も返さない依存メソッドをモックする必要がある場合があります。
このチュートリアルでは、* EasyMockを使用して_void_メソッドをモックするタイミングと方法を確認します。*

2. Mavenの依存関係

まず、https://search.maven.org/search?q = g:org.easymock%20AND%20a:easymock [the EasyMockdependency]を_pom.xml_に追加します。
<dependency>
    <groupId>org.easymock</groupId>
    <artifactId>easymock</artifactId>
    <version>4.0.2</version>
    <scope>test</scope>
</dependency>

3. _void_メソッドをモックする場合

依存関係を持つクラスをテストする場合、通常は依存関係によって返されるすべての値をカバーする必要があります。 ただし、依存関係メソッドが値を返さない場合があります。 したがって、*何も返されない場合、なぜ_void_メソッドをモックしたいのですか?*
voidメソッドは値を返しませんが、*副作用がある可能性があります。 *この例は、_Session.save()_メソッドです。 新しいエンティティを保存すると、_save()_メソッドはidを生成し、渡されたエンティティに設定します。
このため、さまざまな処理結果をシミュレートするためにvoidメソッドをモック化する必要があります。
モックが便利になる別の機会は、voidメソッドによってスローされた例外をテストするときです。

4. _void_メソッドをモックする方法

では、EasyMockを使用してvoidメソッドをモックする方法を見てみましょう。
位置を取得して最低温度と最高温度を設定する_WeatherService_クラスのvoidメソッドをモックする必要があるとします。
public interface WeatherService {
    void populateTemperature(Location location);
}

* 4.1。 モックオブジェクトの作成*

_WeatherService_のモックを作成することから始めましょう。
@Mock
private WeatherService mockWeatherService;
ここでは、EasyMockアノテーション_ @ Mock_を使用してこれを行いました。 ただし、_EasyMock.mock()_メソッドを使用してこれを行うこともできます。
次に、_populateTemperature()_を呼び出して、モックとの予想される相互作用を記録します。
mockWeatherService.populateTemperature(EasyMock.anyObject(Location.class));
さて、このメソッドの処理をシミュレートしたくない場合、この呼び出し自体でメソッドをモックできます。

* 4.2。 例外を投げる*

最初に、クラスがvoidメソッドによってスローされた例外を処理できるかどうかをテストしたい場合を考えてみましょう。 そのためには、これらの例外をスローするような方法でメソッドをモックする必要があります。
この例では、メソッドは_ServiceUnavailableException_をスローします。
EasyMock.expectLastCall().andThrow(new ServiceUnavailableException());
上記のように、これには_andThrow(Throwable)_メソッドを呼び出すだけです。

* 4.3。 メソッド動作のシミュレーション*

前述したように、* voidメソッドの動作をシミュレートする必要がある場合があります*。
私たちの場合、これには、渡された場所の最低温度と最高温度を入力する必要があります。
EasyMock.expectLastCall()
  .andAnswer(() -> {
      Location passedLocation = (Location) EasyMock.getCurrentArguments()[0];
      passedLocation.setMaximumTemparature(new BigDecimal(MAX_TEMP));
      passedLocation.setMinimumTemperature(new BigDecimal(MAX_TEMP - 10));
      return null;
  });
ここでは、_andAnswer(IAnswer)_メソッドを使用して、呼び出されたときの_populateTemperature()_メソッドの動作を定義しました。 次に、_EasyMock.getCurrentArguments()_メソッド(モックメソッドに渡された引数を返す)を使用して、渡された場所を変更しました。
*最後に_null_を返していることに注意してください。これはvoidメソッドをモックしているためです。
また、このアプローチはvoidメソッドのモックに限定されないことに注意してください。 値を返すメソッドにも使用できます。 そこで、渡された引数に基づいて値を返すようにメソッドをモックしたい場合に役立ちます。

* 4.4。 模擬メソッドのリプレイ*

最後に、_EasyMock.replay()_メソッドを使用してモックを「リプレイ」モードに変更し、記録されたアクションが呼び出されたときにリプレイできるようにします。
EasyMock.replay(mockWeatherService);
したがって、テストメソッドを呼び出すと、定義されたカスタム動作を実行する必要があります。

5. 結論

このチュートリアルでは、EasyMockを使用してvoidメソッドをモックする方法を見ました。
そしてもちろん、この記事で使用されているコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/easymock[GitHubで]にあります。