Close

Mockito - Stubbing methods with exceptions

[Last Updated: Aug 11, 2020]

When can use Mockito's when-thenThrow or doThrow-when methods to stub exceptions.

Examples

Example application

package com.logicbig.example;

public interface MyService {
  public int doSomething();
  public int doSomething2() throws Exception;
}
package com.logicbig.example;

public class MyProcessor {
  private MyService myService;

  public MyProcessor(MyService myService) {
      this.myService = myService;
  }

  public String process() {
      int returnInteger = myService.doSomething();
      return String.format("My Integer is: " + returnInteger);
  }

  public String process2() throws Exception {
      int returnInteger = myService.doSomething2();
      return String.format("My Integer is: " + returnInteger);

  }

  public String process3() {
      try {
          int returnInteger = myService.doSomething2();
          return String.format("My Integer is: " + returnInteger);
      } catch (Exception e) {
          System.out.println("-- exception thrown in MyProcess --");
          return "default-value";
      }
  }
}

Testing exceptions

Testing unchecked exception

package com.logicbig.example;

import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class ProcessorTest {

  @Test
  public void processTest() {
      MyService myService = Mockito.mock(MyService.class);
      Mockito.when(myService.doSomething()).thenThrow(new RuntimeException("Cannot process"));
      MyProcessor myProcessor = new MyProcessor(myService);
      try {
          String returnedValue = myProcessor.process();
          TestCase.fail();
      }catch (Exception e){
          System.out.println("-- exception thrown --");
          Assert.assertTrue(e instanceof RuntimeException);
          Assert.assertEquals(e.getMessage(), "Cannot process");
      }

  }
}
D:\mockito-throwing-exception-in-subbing>mvn test -Dtest="ProcessorTest"
[INFO] Scanning for projects...
[INFO]
[INFO] -----< com.logicbig.example:mockito-throwing-exception-in-subbing >-----
[INFO] Building mockito-throwing-exception-in-subbing 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mockito-throwing-exception-in-subbing ---
[INFO] Changes detected - recompiling the module!
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ mockito-throwing-exception-in-subbing ---
[INFO] Changes detected - recompiling the module!
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mockito-throwing-exception-in-subbing ---

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.logicbig.example.ProcessorTest
-- exception thrown --
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.888 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.793 s
[INFO] Finished at: 2020-05-13T00:29:01-05:00
[INFO] ------------------------------------------------------------------------

Note that if we try to throw checked exception in above example i.e.

Mockito.when(myService.doSomething()).thenThrow(new Exception("Cannot process"));

then we will have following runtime exception:

org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: java.lang.Exception: Cannot process

at com.logicbig.example.ProcessorTest.processTest(ProcessorTest.java:13)

Testing checked exception

package com.logicbig.example;

import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class ProcessorTest2 {

  @Test
  public void processTest() throws Exception {
      MyService myService = Mockito.mock(MyService.class);
      Mockito.when(myService.doSomething2()).thenThrow(new Exception("Cannot process"));
      MyProcessor myProcessor = new MyProcessor(myService);
      try {
          String returnedValue = myProcessor.process2();
          TestCase.fail();
      }catch (Throwable e){
          System.out.println("-- exception thrown --");
          Assert.assertTrue(e instanceof Exception);
          Assert.assertEquals(e.getMessage(), "Cannot process");
      }

  }
}
D:\mockito-throwing-exception-in-subbing>mvn test -Dtest="ProcessorTest2"
[INFO] Scanning for projects...
[INFO]
[INFO] -----< com.logicbig.example:mockito-throwing-exception-in-subbing >-----
[INFO] Building mockito-throwing-exception-in-subbing 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mockito-throwing-exception-in-subbing ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ mockito-throwing-exception-in-subbing ---
[INFO] Changes detected - recompiling the module!
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mockito-throwing-exception-in-subbing ---

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.logicbig.example.ProcessorTest2
-- exception thrown --
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.312 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.591 s
[INFO] Finished at: 2020-05-13T00:35:38-05:00
[INFO] ------------------------------------------------------------------------

Testing handled exception

public class ProcessorTest3 {

  @Test
  public void processTest() throws Exception {
      MyService myService = Mockito.mock(MyService.class);
      Mockito.when(myService.doSomething2()).thenThrow(new Exception("Cannot process"));
      MyProcessor myProcessor = new MyProcessor(myService);
      String returnedValue = myProcessor.process3();
      Assert.assertEquals(returnedValue, "default-value");
  }
}
D:\mockito-throwing-exception-in-subbing>mvn test -Dtest="ProcessorTest3"
[INFO] Scanning for projects...
[INFO]
[INFO] -----< com.logicbig.example:mockito-throwing-exception-in-subbing >-----
[INFO] Building mockito-throwing-exception-in-subbing 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mockito-throwing-exception-in-subbing ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ mockito-throwing-exception-in-subbing ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mockito-throwing-exception-in-subbing ---

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.logicbig.example.ProcessorTest3
-- exception thrown in MyProcess --
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.757 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.830 s
[INFO] Finished at: 2020-05-13T00:36:36-05:00
[INFO] ------------------------------------------------------------------------

Using doThrow-when method

package com.logicbig.example;

import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class ProcessorTest4 {

  @Test
  public void processTest() {
      MyService myService = Mockito.mock(MyService.class);
      Mockito.doThrow(new RuntimeException("Cannot process")).when(myService).doSomething();
      MyProcessor myProcessor = new MyProcessor(myService);
      try {
          String returnedValue = myProcessor.process();
          TestCase.fail();
      }catch (Exception e){
          System.out.println("-- exception thrown --");
          Assert.assertTrue(e instanceof RuntimeException);
          Assert.assertEquals(e.getMessage(), "Cannot process");
      }

  }
}
D:\mockito-throwing-exception-in-subbing>mvn test -Dtest="ProcessorTest4"
[INFO] Scanning for projects...
[INFO]
[INFO] -----< com.logicbig.example:mockito-throwing-exception-in-subbing >-----
[INFO] Building mockito-throwing-exception-in-subbing 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mockito-throwing-exception-in-subbing ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mockito-throwing-exception-in-subbing ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ mockito-throwing-exception-in-subbing ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mockito-throwing-exception-in-subbing ---

-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.logicbig.example.ProcessorTest4
-- exception thrown --
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.861 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.656 s
[INFO] Finished at: 2020-05-13T00:37:35-05:00
[INFO] ------------------------------------------------------------------------

We should use doThrow() when we want to stub the void method with an exception.

Example Project

Dependencies and Technologies Used:

  • mockito-core 3.3.3: Mockito mock objects library core API and implementation.
  • junit 4.13: JUnit is a unit testing framework for Java, created by Erich Gamma and Kent Beck.
  • JDK 8
  • Maven 3.5.4

Mockito - Using when-thenThrow() Select All Download
  • mockito-throwing-exception-in-subbing
    • src
      • main
        • java
          • com
            • logicbig
              • example
      • test
        • java
          • com
            • logicbig
              • example
                • ProcessorTest.java

    See Also