3

クラスで特定のメソッドが呼び出されたときに抽象例外がスローされるようにするユースケースがあります。

これを行うために Mockito を使用していますが、メソッドが呼び出されているときに Mockito が単に例外をスローしていないことに気付きました。

テストするクラス:

public void doSomething() throws CustomException {
  try {
    Collection<T> results = dao.getDatabaseResults();
      } catch (ProblemException e) {
          throw new CustomException("There was an exception", e);
  }
}

問題の例外クラス:

public abstract class ProblemException extends RuntimeException {

  public ProblemException(String message) {
      super(message);
  }

  public ProblemException(String message, Throwable e) {
      super(message, e);
  }

テスト クラス:

public testDoSomething() throws Exception {
   CustomDAO mockDAO = Mockito.mock(CustomDAO.class);

   Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException);

   try {
       foo.doSomething();
       Assert.fail();
   } catch (CustomException e) {
      //Some more asserts
   }

現在、抽象クラスの新しいインスタンスを作成できないため、上記のテスト クラスはコンパイルされません。

AbstractException クラスを変更するアクセス権がありません。また、DAO クラスの getDatabaseResults() メソッドによってスローされる例外タイプを変更することもできません。

この問題の最もクリーンな解決策について何か提案はありますか?

考えられることの 1 つは、doSomething() メソッド内で RuntimeException をキャッチすることです (ProblemException がこのクラスを拡張するため)。もっと良い方法があるかどうか興味がありましたか?

ありがとう

4

1 に答える 1

17

抽象クラスを直接インスタンス化することはできませんが、匿名サブクラスを簡単にインスタンス化できます。この場合、メソッドを定義する必要がないため、これは非常に簡単です。

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(new ProblemException(){});

または、別のモックを使用することもできます。

Mockito.when(mockDAO.getDatabaseResults()).thenThrow(Mockito.mock(ProblemException.class));

抽象クラスが、テストで気にしない他のメソッドの定義を強制する場合、これは理にかなっています。

于 2013-04-27T12:44:23.763 に答える