mercredi 28 décembre 2016

Is It Possible to Override an Expected Exception in JUnit?

I recently found out that JUnit > 4.10 allows the usage of @Rule and ExpectedException. Since I'm not big on duplicating code I tried the following. For a better understanding I scaled it down from several tests to just these two. The MockitoJUnitRunner is intentional although it's not used in the small scaled example.

pom.xml

<dependencies>
  <!-- Test dependencies -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.10.19</version>
    <scope>test</scope>
  </dependency>
</dependencies>

TestBase

 @RunWith(MockitoJUnitRunner.class)
 public class TestBase {
   /** JUnit > 4.10 allows expected exception handling like this */
   @Rule
   public ExpectedException exception = ExpectedException.none();

   @Before
   public void setup() {
     this.expectBadParam();
   }

   protected void expectBadParam() {
     this.exception.expect(NullPointerException.class);
   }
 }

The problem is that the following test is not working as I would expect it to. What I'm trying is by default expect an exception type and in some cases run a normal JUnit test. I can't reset the expected exception once it's set.

 public class ExpectedExceptionTest extends TestBase {
   @Test
   public void error() {
     throw new NullPointerException();
   }

   @Test
   public void success() {
     this.exception = ExpectedException.none();
     // this should be a success
   }
 }

I already found a different solution by duplicating the expectBadParam method in each method I expect an exception. However I'm hoping someone can help me understand why this is not working?

Aucun commentaire:

Enregistrer un commentaire