blob: 3664aea1a8d06afdb91195b821bfa28509459804 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.junit;
import junit.framework.ComparisonFailure;
import org.mockito.exceptions.verification.ArgumentsAreDifferent;
public class ExceptionFactory {
private final static boolean hasJUnit = canLoadJunitClass();
private ExceptionFactory() {
}
/**
* If JUnit is used, an AssertionError is returned that extends from JUnit {@link ComparisonFailure} and hence provide a better IDE support as the comparison result is comparable
*/
public static AssertionError createArgumentsAreDifferentException(String message, String wanted, String actual) {
if (hasJUnit) {
return createJUnitArgumentsAreDifferent(message, wanted, actual);
}
return new ArgumentsAreDifferent(message);
}
private static AssertionError createJUnitArgumentsAreDifferent(String message, String wanted, String actual) {
return JUnitArgsAreDifferent.create(message, wanted, actual);
}
private static boolean canLoadJunitClass() {
try {
JUnitArgsAreDifferent.create("message", "wanted", "actual");
} catch (NoClassDefFoundError onlyIfJUnitIsNotAvailable) {
return false;
}
return true;
}
/**
* Don't inline this class! It allows create the JUnit-ArgumentsAreDifferent exception without the need to use reflection.
* <p>
* If JUnit is not available a call to {@link #create(String, String, String)} will throw a {@link NoClassDefFoundError}.
* The {@link NoClassDefFoundError} will be thrown by the class loader cause the JUnit class {@link ComparisonFailure}
* can't be loaded which is a upper class of ArgumentsAreDifferent.
*/
private static class JUnitArgsAreDifferent {
static AssertionError create(String message, String wanted, String actual) {
return new org.mockito.exceptions.verification.junit.ArgumentsAreDifferent(message, wanted, actual);
}
}
}