blob: d31733a1282b47054f59792017ebe950b42ee8bb [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.configuration;
import org.mockito.configuration.IMockitoConfiguration;
import org.mockito.exceptions.base.MockitoException;
import org.mockito.exceptions.misusing.MockitoConfigurationException;
import org.mockito.plugins.MockMaker;
import org.mockito.plugins.StackTraceCleanerProvider;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
/**
* Loads configuration or extension points available in the classpath.
*
* <p>
* <ul>
* <li>
* Can load the mockito configuration. The user who want to provide his own mockito configuration
* should write the class <code>org.mockito.configuration.MockitoConfiguration</code> that implements
* {@link IMockitoConfiguration}. For example :
* <pre class="code"><code class="java">
* package org.mockito.configuration;
*
* //...
*
* public class MockitoConfiguration implements IMockitoConfiguration {
* boolean enableClassCache() { return false; }
*
* // ...
* }
* </code></pre>
* </li>
* <li>
* Can load available mockito extensions. Currently Mockito only have one extension point the
* {@link MockMaker}. This extension point allows a user to provide his own bytecode engine to build mocks.
* <br>Suppose you wrote an extension to create mocks with some <em>Awesome</em> library, in order to tell
* Mockito to use it you need to put in your classpath
* <ol style="list-style-type: lower-alpha">
* <li>The implementation itself, for example <code>org.awesome.mockito.AwesomeMockMaker</code>.</li>
* <li>A file named <code>org.mockito.plugins.MockMaker</code> in a folder named
* <code>mockito-extensions</code>, the content of this file need to have <strong>one</strong> line with
* the qualified name <code>org.awesome.mockito.AwesomeMockMaker</code>.</li>
* </ol>
* </li>
* </ul>
* </p>
*/
public class ClassPathLoader {
public static final String MOCKITO_CONFIGURATION_CLASS_NAME = "org.mockito.configuration.MockitoConfiguration";
/**
* @return configuration loaded from classpath or null
*/
@SuppressWarnings({"unchecked"})
public IMockitoConfiguration loadConfiguration() {
//Trying to get config from classpath
Class configClass;
try {
configClass = (Class) Class.forName(MOCKITO_CONFIGURATION_CLASS_NAME);
} catch (ClassNotFoundException e) {
//that's ok, it means there is no global config, using default one.
return null;
}
try {
return (IMockitoConfiguration) configClass.newInstance();
} catch (ClassCastException e) {
throw new MockitoConfigurationException("MockitoConfiguration class must implement " + IMockitoConfiguration.class.getName() + " interface.", e);
} catch (Exception e) {
throw new MockitoConfigurationException("Unable to instantiate " + MOCKITO_CONFIGURATION_CLASS_NAME +" class. Does it have a safe, no-arg constructor?", e);
}
}
}