title: How to simulate throwing an exception only once in retry with JUnit/Mockito test?
body: <p>I put a simple retry because the operation can rarely fail.  The simplified code is below.  The method <code>putObject</code> can accidentally throw an exception, in this case the retry should allow to invoke this method again.  Is it possible to write a JUnit test for this? 
  I know that with Mockito library we can force to throw an Exception invoking a method but how to force this exception to be thrown only once? </p>
  
  <pre><code>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) -&gt; bucket.putObject(f, d), fileName, data);
      } catch (Exception ex) {
          throw new AException("Failed to write data", ex);
      }
  }
  
  private &lt;T, U&gt; void retryOperation(BiConsumer&lt;T, U&gt; 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 &gt;= 3) {
              retry = false;
          }
      } while (retry);
      if (lastServiceException != null) {
          throw lastServiceException;
      }
  }
  </code></pre>
  
  <p>Test Class:</p>
  
  <pre><code>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);
      }
  }
  </code></pre>