blob: 5e3193e9ab2478bd6d28000f246f8c790db649a0 [file] [log] [blame]
/*
* Copyright (c) 2017 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitousage.bugs;
import org.junit.Test;
import org.mockito.Mock;
import org.mockitousage.IMethods;
import org.mockitoutil.TestBase;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
/**
* These tests check that ThrowsException#answer throws an instance returned
* by Throwable#fillInStackTrace of the provided throwable.
*
* <p>A well-behaved Throwable implementation must always return a reference to this
* from #fillInStackTrace according to the method contract.
* However, Mockito throws the exception returned from #fillInStackTrace for backwards compatibility
* (or the provided exception if the method returns null).
*
* @see Throwable#fillInStackTrace()
* @see <a href="https://github.com/mockito/mockito/issues/866">#866</a>
*/
public class FillInStackTraceScenariosTest extends TestBase {
@Mock IMethods mock;
private class SomeException extends RuntimeException {}
class NullStackTraceException extends RuntimeException {
public Exception fillInStackTrace() {
return null;
}
}
class NewStackTraceException extends RuntimeException {
public Exception fillInStackTrace() {
return new SomeException();
}
}
//issue 866
@Test
public void avoids_NPE() {
when(mock.simpleMethod()).thenThrow(new NullStackTraceException());
try {
mock.simpleMethod();
fail();
} catch(NullStackTraceException e) {}
}
@Test
public void uses_return_value_from_fillInStackTrace() {
when(mock.simpleMethod()).thenThrow(new NewStackTraceException());
try {
mock.simpleMethod();
fail();
} catch(SomeException e) {}
}
}