package fr.openwide.core.test.wicket.more.junit;
import org.apache.wicket.Application;
import org.apache.wicket.util.tester.WicketTester;
import org.springframework.test.context.TestContext;
import org.springframework.test.context.support.AbstractTestExecutionListener;
import fr.openwide.core.wicket.more.application.CoreWicketApplication;
/**
* Hack pour permettre de conserver le même WicketTester pour toutes les méthodes du Test.
* <p>Impossible de passer par une propriété ou une méthode static dans le test lui-même, vu que l'application est obtenue via le contexte spring.
* <p>Il est nécessaire d'utiliser à chaque fois le même WicketTester parce qu'on ne peut pas utiliser plusieurs WicketTester sur la même {@link Application},
* et je (YRO) n'ai pas réussi à renouveler l'application entre chaque méthode avec le DirtiesContextTestExecutionListener.
*/
public class WicketTesterTestExecutionListener extends AbstractTestExecutionListener {
private static String WICKET_TESTER_ATTRIBUTE = WicketTesterTestExecutionListener.class.getName() + ".WICKET_TESTER";
// On réutilise la même application pour chaque test (beforeTestClass, et pas beforeTestMethod)
// C'est un peu sale, mais autrement, il faudrait réinitialiser le contexte spring (dont l'application wicket fait partie),
// et
@Override
public void beforeTestClass(TestContext testContext) throws Exception {
CoreWicketApplication application = testContext.getApplicationContext().getAutowireCapableBeanFactory().getBean(CoreWicketApplication.class);
WicketTester tester = new WicketTester(application);
testContext.setAttribute(WICKET_TESTER_ATTRIBUTE, tester);
}
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
Object testInstance = testContext.getTestInstance();
if (! (testInstance instanceof IWicketTestCase)) {
throw new IllegalStateException("This execution listener can only be used on an " + IWicketTestCase.class.getSimpleName());
}
IWicketTestCase testCase = (IWicketTestCase) testContext.getTestInstance();
WicketTester tester = (WicketTester) testContext.getAttribute(WICKET_TESTER_ATTRIBUTE);
if (!(tester instanceof WicketTester)) {
throw new IllegalStateException("Missing or invalid wicket tester - someone messed up with the test context.");
}
testCase.setWicketTester((WicketTester)tester);
}
@Override
public void afterTestClass(TestContext testContext) throws Exception {
WicketTester tester = (WicketTester) testContext.getAttribute(WICKET_TESTER_ATTRIBUTE);
if (!(tester instanceof WicketTester)) {
throw new IllegalStateException("Missing or invalid wicket tester - someone messed up with the test context.");
}
tester.destroy();
}
}