1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.util.junit;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.junit.runner.notification.Failure;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.exceptions.ExceptionIncludingMockitoWarnings;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.reflection.Whitebox;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class JUnitFailureHacker {
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public void appendWarnings(Failure failure, String warnings) {
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (isEmpty(warnings)) {
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return;
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        //TODO: this has to protect the use in case jUnit changes and this internal state logic fails
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Throwable throwable = (Throwable) Whitebox.getInternalState(failure, "fThrownException");
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        String newMessage = "contains both: actual test failure *and* Mockito warnings.\n" +
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                warnings + "\n *** The actual failure is because of: ***\n";
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        ExceptionIncludingMockitoWarnings e = new ExceptionIncludingMockitoWarnings(newMessage, throwable);
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        e.setStackTrace(throwable.getStackTrace());
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Whitebox.setInternalState(failure, "fThrownException", e);
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private boolean isEmpty(String warnings) {
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return warnings == null || "".equals(warnings); // isEmpty() is in JDK 6+
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}