2017-10-26 2 views
0

操作がほとんど失敗することはほとんどないので、私は単純な再試行をします。簡略化されたコードは以下の通りです。メソッドputObjectは、誤って例外をスローする可能性があります。この場合、再試行でこのメソッドを再度呼び出すことができます。このためにJUnitテストを書くことは可能ですか? Mockitoライブラリでは、メソッドを呼び出すExceptionをスローすることができますが、この例外を強制的に1回だけスローするように強制することはできますか?JUNIT/Mockitoテストで再試行で例外を1回だけスローするシミュレーション方法は?

public class RetryExample { 
Bucket bucket = new Bucket(); 
static int INTERNAL_EXCEPTION_CODE = 100; 
class AException extends RuntimeException { 
    private static final long serialVersionUID = 1L; 
    int statusCode; 
    public int getStatusCode() { 
     return statusCode; 
    } 
} 

class Bucket { 
    public void putObject(String fileName, byte[] data) throws AException { 
     System.out.println("PutObject=" + fileName + " data=" + data); 
    } 
} 

public void process(String fileName, byte[] data) throws AException { 
    try { 
     retryOperation((f, d) -> bucket.putObject(f, d), fileName, data); 
    } catch (Exception ex) { 
     throw new AException("Failed to write data", ex); 
    } 
} 

private <T, U> void retryOperation(BiConsumer<T, U> biConsumer, T t, U u) { 
    int retries = 0; 
    boolean retry = false; 
    AException lastServiceException = null; 
    do { 
     try { 
      biConsumer.accept(t, u); 
     } catch (AException e) { 
      lastServiceException = e; 
      int statusCode = e.getStatusCode(); 
      if (statusCode == INTERNAL_EXCEPTION_CODE) { 
       throw e; 
      } else { 
       break; 
      } 
     } 
     retries++; 
     if (retries >= 3) { 
      retry = false; 
     } 
    } while (retry); 
    if (lastServiceException != null) { 
     throw lastServiceException; 
    } 
} 

テストクラス:

public class RetryExampleTest { 
... 
@Test 
public void test() { 
    RetryExample retryExample = new RetryExample(); 
    String fileName = "TestFile"; 
    byte[] data = simulatedPayload(10000); 
    try { 
     retryExample.process(fileName, data); 
    } catch (Exception e) { 
     fail("Exception thrown=" + e); 
    } 
} 

答えて

1

Mockito documentationによれば、連続したメソッド呼び出しに対して異なる動作を設定できます。

when(mock.someMethod("some arg")) 
    .thenThrow(new RuntimeException()) 
    .thenReturn("foo"); 
あなたが似たような( Mockito documentation)を行うことができますvoidメソッドの場合

doThrow(new RuntimeException()) 
    .doNothing() 
    .when(mock).doSomething(); 
+0

グレート!もしmock.someMethod void? –

+0

それは何ですか?(模擬).doSomething()voidメソッドですか? (モックはカッコ内にある) –

+0

doReturn( "foo")ではなくdoNothing? –

0

は、私はあなただけにグローバルデータオブジェクトを撮影したMockitoライブラリで例外メソッドを呼び出して、スロー例外の時間を保存するためにグローバルデータオブジェクトを使用することができると思います時間を記録する。それは簡単だろう。ちょうどあなたのコントロールですべて。

関連する問題