/*
* 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);
}
}
}