操作がほとんど失敗することはほとんどないので、私は単純な再試行をします。簡略化されたコードは以下の通りです。メソッド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);
}
}
グレート!もしmock.someMethod void? –
それは何ですか?(模擬).doSomething()voidメソッドですか? (モックはカッコ内にある) –
doReturn( "foo")ではなくdoNothing? –