/* * Copyright (c) 2006-2012 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit.internal.startup; import java.io.IOException; import org.test4j.jmockit.JUnit4BuilderDecorator; import mockit.integration.junit3.internal.JUnitTestCaseDecorator; import mockit.integration.junit3.internal.TestSuiteDecorator; import mockit.integration.junit4.internal.BlockJUnit4ClassRunnerDecorator; import mockit.integration.junit4.internal.JUnit4TestRunnerDecorator; import mockit.integration.junit4.internal.RunNotifierDecorator; import mockit.integration.testng.internal.MockTestNG; import mockit.internal.annotations.ClassStubbing; import mockit.internal.annotations.MockClassSetup; import mockit.internal.expectations.mocking.MockedBridge; import mockit.internal.util.Utilities; final class JMockitInitialization { private static final String[] NO_STUBBING_FILTERS = {}; private final StartupConfiguration config; JMockitInitialization() throws IOException { config = new StartupConfiguration(); } void initialize(boolean initializeTestNG) { MockedBridge.preventEventualClassLoadingConflicts(); loadInternalStartupMocksForJUnitIntegration(); if (initializeTestNG) { try { setUpInternalStartupMock(MockTestNG.class); } catch (Error ignored) { } } loadExternalToolsIfAny(); stubOutClassesIfAny(); setUpStartupMocksIfAny(); } private void loadInternalStartupMocksForJUnitIntegration() { if (setUpInternalStartupMock(TestSuiteDecorator.class)) { try { setUpInternalStartupMock(JUnitTestCaseDecorator.class); } catch (VerifyError ignore) { // For some reason, this error occurs when running TestNG tests // from Maven. } setUpInternalStartupMock(RunNotifierDecorator.class); setUpInternalStartupMock(BlockJUnit4ClassRunnerDecorator.class); setUpInternalStartupMock(JUnit4TestRunnerDecorator.class); /** added by davey.wu **/ setUpInternalStartupMock(JUnit4BuilderDecorator.class); /** end added by davey.wu **/ } } private boolean setUpInternalStartupMock(Class<?> mockClass) { try { new MockClassSetup(mockClass).setUpStartupMock(); return true; } catch (TypeNotPresentException ignore) { // OK, ignore the startup mock if the necessary third-party class // files are not in the classpath. return false; } } private void loadExternalToolsIfAny() { for (String toolClassName : config.externalTools) { new ToolLoader(toolClassName).loadTool(); } } private void stubOutClassesIfAny() { for (String stubbing : config.classesToBeStubbedOut) { int p = stubbing.indexOf('#'); String realClassName = stubbing; String[] filters = NO_STUBBING_FILTERS; if (p > 0) { realClassName = stubbing.substring(0, p); filters = stubbing.substring(p + 1).split("\\|"); } Class<?> realClass = Utilities.loadClass(realClassName.trim()); new ClassStubbing(realClass, true, filters).stubOutAtStartup(); } } private void setUpStartupMocksIfAny() { for (String mockClassName : config.mockClasses) { Class<?> mockClass = Utilities.loadClass(mockClassName); new MockClassSetup(mockClass).setUpStartupMock(); } } }