package org.test4j.module.core; import java.lang.reflect.Method; import java.util.List; import org.test4j.module.core.ClazzAroundObject.ClazzAfterObject; import org.test4j.module.core.utility.ConfigurationLoader; import org.test4j.module.core.utility.MessageHelper; import org.test4j.module.core.utility.ModulesLoader; import org.test4j.module.core.utility.ModulesManager; import org.test4j.module.jmockit.utility.JMockitModuleHelper; import org.test4j.tools.commons.ConfigHelper; /** * test4j的核心类,所有事件监听器的总入口<br> */ public class CoreModule { static { JMockitModuleHelper.getJMockitJavaagentHit(); } private static CoreModule instance; /** * Returns the singleton instance * * @return the singleton instance, not null */ public static synchronized CoreModule getInstance() { if (instance == null) { initSingletonInstance(); } return instance; } /** * 初始化test4j,要保证这个方法在使用test4j功能之前被调用<br> * <br> * Initializes the singleton instance to the default value, loading the * configuration using the {@link ConfigurationLoader} */ static boolean hasInitial = false; public static void initSingletonInstance() { if (hasInitial) { return; } try { hasInitial = true; ConfigurationLoader.loading(); MessageHelper.level = ConfigHelper.logLevel(); instance = new CoreModule(); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } /* Listener that observes the execution of tests */ private final TestListener testListener; /** * Creates a new instance. */ public CoreModule() { List<Module> modules = ModulesLoader.loading(); this.testListener = new CoreModuleListener(); for (Module module : modules) { module.afterInit(); } } /** * Returns the single instance of {@link TestListener}. This instance * provides hook callback methods that enable intervening during the * execution of unit tests. * * @return The single {@link TestListener} */ public static TestListener getTestListener() { return getInstance().testListener; } /** * Implementation of {@link TestListener} that ensures that at every point * during the run of a test, every {@link Module} gets the chance of * performing some behavior, by calling the {@link TestListener} of each * module in turn. Also makes sure that the state of the instance of * {@link TestContext} returned by {@link CoreModule#getTestContext()} is * correctly set to the current test class, test object and test method. */ private class CoreModuleListener extends TestListener { @SuppressWarnings("rawtypes") @Override public void beforeClass(Class testClazz) { MessageHelper.resetLog4jLevel(); TestContext.setContext(testClazz); List<TestListener> listeners = ModulesManager.getTestListeners(); for (TestListener listener : listeners) { try { listener.beforeClass(testClazz); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } } @Override public void beforeMethod(Object testObject, Method testMethod) { TestContext.setContext(testObject, testMethod); List<TestListener> listeners = ModulesManager.getTestListeners(); for (TestListener listener : listeners) { try { listener.beforeMethod(testObject, testMethod); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } } @Override public void beforeRunning(Object testObject, Method testMethod) { TestContext.setContext(testObject, testMethod); List<TestListener> listeners = ModulesManager.getTestListeners(); for (TestListener listener : listeners) { try { listener.beforeRunning(testObject, testMethod); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } // TracerManager.startTracer(); } @Override public void afterRunned(Object testObject, Method testMethod, Throwable throwable) { // TracerManager.endTracer(); TestContext.setContext(testObject, testMethod); List<TestListener> listeners = ModulesManager.getTestListeners_Reverse(); for (TestListener listener : listeners) { try { listener.afterRunned(testObject, testMethod, throwable); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } } @Override public void afterMethod(Object testObject, Method testMethod) { TestContext.setContext(testObject, testMethod); List<TestListener> listeners = ModulesManager.getTestListeners_Reverse(); for (TestListener listener : listeners) { try { listener.afterMethod(testObject, testMethod); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } } @Override public void afterClass(Object testObject) { List<TestListener> listeners = ModulesManager.getTestListeners_Reverse(); for (TestListener listener : listeners) { try { listener.afterClass(testObject); } catch (RuntimeException e) { e.printStackTrace(); throw e; } } TestContext.setContext(new ClazzAfterObject(testObject.getClass()), null); } @Override protected String getName() { return "CoreModuleListener"; } } }