1 /* 2 * Copyright (c) 2017 Mockito contributors 3 * This program is made available under the terms of the MIT License. 4 */ 5 package org.mockitoutil; 6 7 import static org.junit.Assert.assertEquals; 8 9 /** 10 * Clean asserts for exception handling 11 */ 12 public class ThrowableAssert { 13 14 private Throwable reportedException; 15 16 private ThrowableAssert(Runnable runnable) { 17 try { 18 runnable.run(); 19 } catch (Throwable t) { 20 this.reportedException = t; 21 return; 22 } 23 throw new AssertionError("Expected runnable to throw an exception but it didn't"); 24 } 25 26 public ThrowableAssert throwsException(Class<? extends Throwable> exceptionType) { 27 if(!exceptionType.isInstance(reportedException)) { 28 throw new AssertionError("Exception should be of type: " 29 + exceptionType.getSimpleName() + " but it was: " 30 + reportedException.getClass().getSimpleName()); 31 } 32 return this; 33 } 34 35 public ThrowableAssert throwsMessage(String exceptionMessage) { 36 assertEquals(exceptionMessage, reportedException.getMessage()); 37 return this; 38 } 39 40 /** 41 * Executes provided runnable, expects it to throw an exception. 42 * Then, it offers ways to assert on the expected exception. 43 */ 44 public static ThrowableAssert assertThat(Runnable runnable) { 45 return new ThrowableAssert(runnable); 46 } 47 } 48