/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import org.springframework.test.context.TestContext;
import org.springframework.test.context.support.AbstractTestExecutionListener;
/**
* This class is added to all {@link BaseContextSensitiveTest} classes due to being in the list of
* "@TestExecutionListeners" annotation. This looks for the "@SkipInitializationData",
* "@SkipStandardData" and "@SkipAuthorization" annotations on the current test method and skips the
* associated action in the {@link BaseContextSensitiveTest#setupDatabaseWithStandardData()} method
*
* @see SkipBaseSetup
* @see BaseContextSensitiveTest
*/
public class SkipBaseSetupAnnotationExecutionListener extends AbstractTestExecutionListener {
/**
* This method is run before all "@Before" methods thanks to Spring and the
* "@TestExecutionListeners" annotation on the {@link BaseContextSensitiveTest} class.
*
* @see org.springframework.test.context.support.AbstractTestExecutionListener#beforeTestMethod(org.springframework.test.context.TestContext)
*/
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
Method testMethod = testContext.getTestMethod();
Annotation skipBaseSetup = testMethod.getAnnotation(SkipBaseSetup.class);
// if the method doesn't have the annotation, check the class
if (skipBaseSetup == null)
skipBaseSetup = testContext.getTestClass().getAnnotation(SkipBaseSetup.class);
// if the annotation exists, call BaseContextSensitiveTest#skipBaseSetup()
// so that the method calls in baseSetupWithStandardDataAndAuthentication()
// are not run.
if (skipBaseSetup != null) {
callMethod(testContext, "skipBaseSetup");
}
}
/**
* Convenience method to call the given method on the current test class as denoted by the
* TestContext
*
* @param testContext current context that has the current test class/method on it
* @param methodName the name of the method to invoke
* @throws Exception
*/
private void callMethod(TestContext testContext, String methodName) throws Exception {
Method method = null;
try {
method = testContext.getTestClass().getMethod(methodName);
}
catch (NoSuchMethodException e) {
throw new Exception("There is no method named '" + methodName + "' on the " + testContext.getTestClass()
+ " class", e);
}
method.invoke(testContext.getTestInstance());
}
}