/* * Copyright (c) 2016 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockito.plugins; import org.mockito.Incubating; /** * Allows switching off the plugins that are discovered on classpath. * * <p> * Mockito will invoke this interface in order to select whether a plugin is enabled or not. * </p> * * <p> * When a particular plugin is switched off, the default Mockito behavior is used. * For example, if Android's dexmaker MockMaker is switched off, * Mockito default MockMaker implementation is used {@link org.mockito.plugins.MockMaker} * </p> * * <h3>Using the extension point</h3> * * <p> * The plugin mechanism of mockito works in a similar way as the {@link java.util.ServiceLoader}, however instead of * looking in the <code>META-INF</code> directory, Mockito will look in <code>mockito-extensions</code> directory. * <em>The reason for that is that Android SDK strips jar from the <code>META-INF</code> directory when creating an APK.</em> * </p> * * <ol style="list-style-type: lower-alpha"> * <li>The implementation itself, for example <code>org.awesome.mockito.AwesomeMockMaker</code> that extends the <code>MockMaker</code>.</li> * <li>A file "<code>mockito-extensions/org.mockito.plugins.MockMaker</code>". The content of this file is * exactly a <strong>one</strong> line with the qualified name: <code>org.awesome.mockito.AwesomeMockMaker</code>.</li> * </ol></p> * * <p>Note that if several <code>mockito-extensions/org.mockito.plugins.MockMaker</code> files exists in the classpath * Mockito will only use the first returned by the standard {@link ClassLoader#getResource} mechanism. * <p> * So just create a custom implementation of {@link PluginSwitch} and place the qualified name in the following file * <code>mockito-extensions/org.mockito.plugins.PluginSwitch</code>. * </p> * * @since 1.10.15 */ @Incubating public interface PluginSwitch { /** * Mockito invokes this method for every plugin found in the classpath * (except from the {@code PluginSwitch} implementation itself). * If no custom plugins are discovered this method is not invoked. * * @since 1.10.15 */ boolean isEnabled(String pluginClassName); }