1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5
6package org.mockito.internal.stubbing.answers;
7
8import org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter;
9import org.mockito.invocation.InvocationOnMock;
10import org.mockito.stubbing.Answer;
11import org.objenesis.ObjenesisHelper;
12
13import static org.mockito.internal.exceptions.Reporter.notAnException;
14
15import java.io.Serializable;
16
17public class ThrowsExceptionClass implements Answer<Object>, Serializable {
18
19    private final Class<? extends Throwable> throwableClass;
20    private final ConditionalStackTraceFilter filter = new ConditionalStackTraceFilter();
21
22    public ThrowsExceptionClass(Class<? extends Throwable> throwableClass) {
23        this.throwableClass = checkNonNullThrowable(throwableClass);
24    }
25
26    private Class<? extends Throwable> checkNonNullThrowable(Class<? extends Throwable> throwableClass) {
27        if(throwableClass == null || !Throwable.class.isAssignableFrom(throwableClass)) {
28            throw notAnException();
29        }
30        return throwableClass;
31    }
32
33    public Object answer(InvocationOnMock invocation) throws Throwable {
34        //TODO centralize the use of Objenesis. Why do we use ObjenesisHelper?
35        Throwable throwable = ObjenesisHelper.newInstance(throwableClass);
36        throwable.fillInStackTrace();
37        filter.filter(throwable);
38        throw throwable;
39    }
40
41    public Class<? extends Throwable> getThrowableClass() {
42        return throwableClass;
43    }
44}
45