blob: 49d165003d3b79aefe67e63e2f3116ebad20bf93 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 by SAP AG, Walldorf.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* This class is based on work by Shay Banon (http://www.kimchy.org/before_after_testcase_with_junit/)
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.jaxws.testutils.jmock.testcases;
import java.lang.reflect.Method;
import java.util.Vector;
import junit.framework.Test;
public class BeforeAfterEnabler {
private final IBeforeAfterEnabled tc;
private int testCount = 0;
private final int totalTestCount;
private boolean disableAfterTestCase = false;
public BeforeAfterEnabler(IBeforeAfterEnabled tc) {
this.tc = tc;
totalTestCount = countTotalTests();
}
public void runBare() throws Throwable {
Throwable exception = null;
if (testCount == 0) {
beforeTestCase();
}
testCount++;
try {
tc.runBareInternal();
} catch (Throwable running) {
exception = running;
}
if (testCount == totalTestCount) {
if (!disableAfterTestCase) {
try {
afterTestCase();
} catch (Exception afterTestCase) {
if (exception == null) exception = afterTestCase;
}
} else {
disableAfterTestCase = false;
}
}
if (exception != null) throw exception;
}
public void disableAfterTestCase() {
disableAfterTestCase = true;
}
/**
* Called before any tests within this test case.
*
* @throws Exception
*/
protected void beforeTestCase() throws Exception {
tc.beforeTestCase();
}
/**
* Called after all the tests within the test case
* have executed.
*
* @throws Exception
*/
protected void afterTestCase() throws Exception {
tc.afterTestCase();
}
private int countTotalTests() {
int count = 0;
Class<?> superClass = tc.getClass();
Vector<String> names = new Vector<String>();
while (Test.class.isAssignableFrom(superClass)) {
Method[] methods = superClass.getDeclaredMethods();
for (Method method : methods) {
String name = method.getName();
if (names.contains(name))
continue;
names.addElement(name);
if (isTestMethod(method)) {
count++;
}
}
superClass = superClass.getSuperclass();
}
return count;
}
private boolean isTestMethod(Method m) {
String name = m.getName();
Class<?>[] parameters = m.getParameterTypes();
Class<?> returnType = m.getReturnType();
return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
}
}