package org.powermock.api.extension.reporter; import org.powermock.core.reporter.MockingFrameworkReporter; import org.powermock.reflect.Whitebox; import static org.powermock.utils.StringJoiner.join; /** * The MockingFrameworkReporterFactory which create a new instance of MockingFrameworkReporter * which is loaded by current context class loader. */ @SuppressWarnings("WeakerAccess") public class MockingFrameworkReporterFactoryImpl extends AbstractMockingFrameworkReporterFactory { @Override protected String getImplementerClassName() { return "org.powermock.api.extension.reporter.MockingFrameworkReporterFactoryImpl$MockitoMockingFrameworkReporter"; } @SuppressWarnings("unused") private static class MockitoMockingFrameworkReporter implements MockingFrameworkReporter { private org.mockito.exceptions.Reporter mockitoReporter; private org.mockito.internal.MockitoCore mockitoCore; private org.mockito.exceptions.Reporter getMockitoReporter(Object mockitoCore) { return Whitebox.getInternalState(mockitoCore, "reporter"); } private void setMockitoReporter(org.mockito.exceptions.Reporter reporter, org.mockito.internal.MockitoCore mockitoCore) { Whitebox.setInternalState(mockitoCore, "reporter", reporter); } @Override public void enable() { mockitoCore = getMockitoCoreForCurrentClassLoader(); mockitoReporter = getMockitoReporter(mockitoCore); PowerMockitoReporter powerMockitoReporter = new PowerMockitoReporter(); setMockitoReporter(powerMockitoReporter, mockitoCore); } private org.mockito.internal.MockitoCore getMockitoCoreForCurrentClassLoader() { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); try { return Whitebox.getInternalState(classLoader.loadClass("org.mockito.Mockito"), "MOCKITO_CORE"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Override public void disable() { setMockitoReporter(mockitoReporter, mockitoCore); } } /** * PowerMock reported for Mockito, which replace standard mockito message * to specific message for cases when PowerMock is used. */ private static class PowerMockitoReporter extends org.mockito.exceptions.Reporter { public void missingMethodInvocation() { throw new org.mockito.exceptions.misusing.MissingMethodInvocationException(join( "when() requires an argument which has to be 'a method call on a mock'.", "For example:", " when(mock.getArticles()).thenReturn(articles);", "Or 'a static method call on a prepared class`", "For example:", " @PrepareForTest( { StaticService.class }) ", " TestClass{", " public void testMethod(){", " PowerMockito.mockStatic(StaticService.class);", " when(StaticService.say()).thenReturn(expected);", " }", " }", "", "Also, this error might show up because:", "1. inside when() you don't call method on mock but on some other object.", "2. inside when() you don't call static method, but class has not been prepared.", "" )); } } }