From dac474e8c54b951c16609d117a75e379b3564fd4 Mon Sep 17 00:00:00 2001 From: Arthur Zagretdinov Date: Fri, 4 Aug 2017 13:54:21 +0200 Subject: [PATCH] Fixes #726 Mockito Public API Support Using Mockito API for stubbing and creating invocation. --- .gitignore | 1 - build.gradle | 2 +- docs/changelog.txt | 4 + .../mockito/internal/PowerMockitoCore.java | 12 ++- .../expectation/PowerMockitoStubberImpl.java | 97 ++++++++++--------- .../mockito/invocation/InvocationFactory.java | 48 +++------ .../invocation/MockHandlerAdaptor.java | 27 ++++-- .../MockitoMethodInvocationControl.java | 19 +--- .../api/mockito/mockmaker/PowerMockMaker.java | 12 ++- .../powermockito/junit4/spy/SpyTest.java | 11 ++- .../StaticAndInstanceDemoTest.java | 37 +++---- .../junit4/system/ServiceLoaderTest.java | 4 +- .../junit4/system/SystemClassUserTest.java | 1 + 13 files changed, 146 insertions(+), 129 deletions(-) diff --git a/.gitignore b/.gitignore index 3b4c30b35..b22d8c6f0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,3 @@ repo .idea **/build/** .gradle -**/classes/** \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1d63e004d..73a8ce9c9 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ ext{ junitRulesVersion = "4.8.2" testngVersion = "6.9.10" xstreamVersion = "1.4.9" - mockitoVersion = "2.8.48" + mockitoVersion = "2.8.54" servletVersion = "2.5" systemRulesVersion = "1.16.0" jacocoVersion = "0.7.7.201606060606" diff --git a/docs/changelog.txt b/docs/changelog.txt index 2ca3687bf..d491c22f2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -1,3 +1,7 @@ +Change log 2.0.0 +* Public Mockito support: +** Possible incapability due toString methods returns by default name of mocked. + Change log 1.7.1 * Fixed #832 Provide a new API for verifying static mock and deprecate old for Mockito diff --git a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/PowerMockitoCore.java b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/PowerMockitoCore.java index 313a3b8f0..cfee7ae46 100644 --- a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/PowerMockitoCore.java +++ b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/PowerMockitoCore.java @@ -16,10 +16,12 @@ */ package org.powermock.api.mockito.internal; +import org.mockito.Mockito; import org.mockito.internal.progress.MockingProgress; import org.mockito.internal.progress.ThreadSafeMockingProgress; import org.mockito.internal.verification.MockAwareVerificationMode; import org.mockito.stubbing.Answer; +import org.mockito.stubbing.Stubber; import org.mockito.verification.VerificationMode; import org.powermock.api.mockito.expectation.PowerMockitoStubber; import org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl; @@ -28,17 +30,21 @@ public class PowerMockitoCore { @SuppressWarnings("rawtypes") public PowerMockitoStubber doAnswer(Answer answer) { + // We change the context classloader to the current CL in order for the Mockito // framework to load it's plugins (such as MockMaker) correctly. + + final Stubber stubber; final ClassLoader originalCL = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); try { - getMockingProgress().stubbingStarted(); + stubber = Mockito.doAnswer(answer); } finally { Thread.currentThread().setContextClassLoader(originalCL); } - getMockingProgress().resetOngoingStubbing(); - return (PowerMockitoStubber) new PowerMockitoStubberImpl().doAnswer(answer); + + return new PowerMockitoStubberImpl(stubber); } private MockingProgress getMockingProgress() { diff --git a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/expectation/PowerMockitoStubberImpl.java b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/expectation/PowerMockitoStubberImpl.java index 0e8c718b7..72c2a739b 100644 --- a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/expectation/PowerMockitoStubberImpl.java +++ b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/internal/expectation/PowerMockitoStubberImpl.java @@ -16,89 +16,102 @@ */ package org.powermock.api.mockito.internal.expectation; -import org.mockito.internal.stubbing.StubberImpl; import org.mockito.stubbing.Answer; import org.mockito.stubbing.Stubber; import org.powermock.api.mockito.expectation.PowerMockitoStubber; import org.powermock.api.mockito.expectation.PrivatelyExpectedArguments; import org.powermock.api.mockito.invocation.MockitoMethodInvocationControl; -import org.powermock.api.mockito.invocation.MockHandlerAdaptor; import org.powermock.core.MockRepository; import org.powermock.reflect.Whitebox; import java.lang.reflect.Method; -import java.util.List; /** * Extension of the standard Mocktio stubber implementation that also support * PowerMockito created mocks. */ -public class PowerMockitoStubberImpl extends StubberImpl implements PowerMockitoStubber { - +public class PowerMockitoStubberImpl implements PowerMockitoStubber, Stubber { + + private final Stubber stubber; + + public PowerMockitoStubberImpl(final Stubber stubber) {this.stubber = stubber;} + @Override - public void when(Class classMock) { - MockitoMethodInvocationControl invocationControl = (MockitoMethodInvocationControl) MockRepository - .getStaticMethodInvocationControl(classMock); - addAnswersForStubbing(invocationControl); - } - - /** - * Supports PowerMockito mocks. If {@code mock} is not a PowerMockito - * mock it will delegate to Mockito. - * - * @see Stubber#when(Object) - */ - @Override - public T when(T instanceMock) { - MockitoMethodInvocationControl invocationControl = (MockitoMethodInvocationControl) MockRepository - .getInstanceMethodInvocationControl(instanceMock); + public T when(final T instanceMock) { + final MockitoMethodInvocationControl invocationControl = (MockitoMethodInvocationControl) MockRepository.getInstanceMethodInvocationControl(instanceMock); final T returnValue; if (invocationControl == null) { - returnValue = super.when(instanceMock); + returnValue = stubber.when(instanceMock); } else { - addAnswersForStubbing(invocationControl); + final Object mock = invocationControl.getMockHandlerAdaptor().getMock(); + stubber.when(mock); returnValue = instanceMock; } return returnValue; } - - @SuppressWarnings("unchecked") - private void addAnswersForStubbing(MockitoMethodInvocationControl invocationControl) { - final MockHandlerAdaptor mockHandler = invocationControl.getMockHandlerAdaptor(); - final List> answers = Whitebox.getInternalState(this, List.class); - mockHandler.setAnswersForStubbing(answers); + + @Override + public Stubber doThrow(final Throwable... toBeThrown) {return stubber.doThrow(toBeThrown);} + + @Override + public Stubber doThrow(final Class toBeThrown) {return stubber.doThrow(toBeThrown);} + + @Override + public Stubber doThrow(final Class toBeThrown, final Class[] nextToBeThrown) {return stubber.doThrow(toBeThrown, nextToBeThrown);} + + @Override + public Stubber doAnswer(final Answer answer) {return stubber.doAnswer(answer);} + + @Override + public Stubber doNothing() {return stubber.doNothing();} + + @Override + public Stubber doReturn(final Object toBeReturned) {return stubber.doReturn(toBeReturned);} + + @Override + public Stubber doReturn(final Object toBeReturned, + final Object... nextToBeReturned) {return stubber.doReturn(toBeReturned, nextToBeReturned);} + + @Override + public Stubber doCallRealMethod() {return stubber.doCallRealMethod();} + + @Override + public void when(Class classMock) { + MockitoMethodInvocationControl invocationControl = (MockitoMethodInvocationControl) MockRepository.getStaticMethodInvocationControl(classMock); + final Object mock = invocationControl.getMockHandlerAdaptor().getMock(); + stubber.when(mock); } - + @Override public PrivatelyExpectedArguments when(T mock, Method method) throws Exception { assertNotNull(mock, "mock"); assertNotNull(method, "Method"); - prepareForStubbing(mock); + this.when(mock); return new DefaultPrivatelyExpectedArguments(mock, method); } - + @Override public void when(T mock, Object... arguments) throws Exception { assertNotNull(mock, "mock"); - prepareForStubbing(mock); + this.when(mock); Whitebox.invokeMethod(mock, arguments); } - + @Override public void when(T mock, String methodToExpect, Object... arguments) throws Exception { assertNotNull(mock, "mock"); assertNotNull(methodToExpect, "methodToExpect"); - prepareForStubbing(mock); + this.when(mock); Whitebox.invokeMethod(mock, methodToExpect, arguments); } - + @Override public void when(Class classMock, Object... arguments) throws Exception { assertNotNull(classMock, "classMock"); when(classMock); Whitebox.invokeMethod(classMock, arguments); } - + @Override public void when(Class classMock, String methodToExpect, Object... parameters) throws Exception { assertNotNull(classMock, "classMock"); @@ -106,7 +119,7 @@ public void when(Class classMock, String methodToExpect, Object... parame when(classMock); Whitebox.invokeMethod(classMock, methodToExpect, parameters); } - + @Override public PrivatelyExpectedArguments when(Class classMock, Method method) throws Exception { assertNotNull(classMock, "classMock"); @@ -114,16 +127,10 @@ public PrivatelyExpectedArguments when(Class classMock, Method method) th when(classMock); return new DefaultPrivatelyExpectedArguments(classMock, method); } - + private void assertNotNull(Object object, String name) { if (object == null) { throw new IllegalArgumentException(name + " cannot be null"); } } - - private void prepareForStubbing(T mock) { - MockitoMethodInvocationControl invocationControl = (MockitoMethodInvocationControl) MockRepository.getInstanceMethodInvocationControl(mock); - addAnswersForStubbing(invocationControl); - } - } diff --git a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/InvocationFactory.java b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/InvocationFactory.java index 789b64634..6d22c16aa 100644 --- a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/InvocationFactory.java +++ b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/InvocationFactory.java @@ -18,13 +18,9 @@ package org.powermock.api.mockito.invocation; -import org.mockito.internal.creation.DelegatingMethod; -import org.mockito.internal.debugging.LocationImpl; -import org.mockito.internal.invocation.InvocationImpl; -import org.mockito.internal.invocation.realmethod.CleanTraceRealMethod; -import org.mockito.internal.invocation.realmethod.RealMethod; -import org.mockito.internal.progress.SequenceNumber; +import org.mockito.Mockito; import org.mockito.invocation.Invocation; +import org.mockito.mock.MockCreationSettings; import org.powermock.api.support.SafeExceptionRethrower; import org.powermock.core.MockGateway; import org.powermock.core.MockRepository; @@ -33,49 +29,33 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.concurrent.Callable; class InvocationFactory { - Invocation createInvocation(final Object interceptionObject, final Method method, final Object... arguments) { - final CleanTraceRealMethod cleanTraceRealMethod = createRealMethod(interceptionObject, method); - - return new InvocationImpl( - interceptionObject, - new DelegatingMethod(method), - arguments, - SequenceNumber.next(), - cleanTraceRealMethod, - new LocationImpl() - ); + Invocation createInvocation(final Object mock, final Method method, final MockCreationSettings settings, + final Object... arguments) { + final Callable realMethod = createRealMethod(mock, method, arguments); + return Mockito.framework().createInvocation(mock, settings, method, realMethod, arguments); } - private CleanTraceRealMethod createRealMethod(final Object interceptionObject, final Method method) { - return new CleanTraceRealMethod(new RealMethod() { - private static final long serialVersionUID = 4564320968038564170L; - + private Callable createRealMethod(final Object delegator, final Method method, + final Object... arguments) { + return new Callable() { @Override - public Object invoke(Object target, Object[] arguments) throws Throwable { - /* - * Instruct the MockGateway to don't intercept the next call. - * The reason is that when Mockito is spying on objects it - * should call the "real method" (which is proxied by Mockito - * anyways) so that we don't end up in here one more time which - * causes infinite recursion. This should not be done if the - * interceptionObject is a final system class because these are - * never caught by the Mockito proxy. - */ - final Class type = Whitebox.getType(interceptionObject); + public Object call() throws Exception { + final Class type = Whitebox.getType(delegator); final boolean isFinalSystemClass = type.getName().startsWith("java.") && Modifier.isFinal(type.getModifiers()); if (!isFinalSystemClass) { MockRepository.putAdditionalState(MockGateway.DONT_MOCK_NEXT_CALL, true); } try { - return method.invoke(target, arguments); + return method.invoke(delegator, arguments); } catch (InvocationTargetException e) { SafeExceptionRethrower.safeRethrow(e.getCause()); } return null; } - }); + }; } } diff --git a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockHandlerAdaptor.java b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockHandlerAdaptor.java index c5cc7e472..e66d6b902 100644 --- a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockHandlerAdaptor.java +++ b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockHandlerAdaptor.java @@ -18,9 +18,10 @@ package org.powermock.api.mockito.invocation; +import org.mockito.MockingDetails; +import org.mockito.Mockito; import org.mockito.exceptions.base.MockitoAssertionError; import org.mockito.exceptions.misusing.NotAMockException; -import org.mockito.internal.util.MockUtil; import org.mockito.invocation.Invocation; import org.mockito.invocation.InvocationContainer; import org.mockito.invocation.MockHandler; @@ -36,12 +37,14 @@ * The class provides a access to method and data of {@link org.mockito.invocation.MockHandler} from the given mock instance. */ public class MockHandlerAdaptor { - private final T mockInstance; + private final T mock; private final InvocationFactory invocationFactory; + private final MockingDetails mockingDetails; - MockHandlerAdaptor(final T mockInstance) { - this.mockInstance = mockInstance; + MockHandlerAdaptor(final T mock) { + this.mock = mock; this.invocationFactory = new InvocationFactory(); + this.mockingDetails = Mockito.mockingDetails(mock); } public void setAnswersForStubbing(final List> answers) { @@ -53,17 +56,21 @@ public void setAnswersForStubbing(final List> answers) { } } - private MockHandler getMockHandler(){ - return MockUtil.getMockHandler(mockInstance); + public Object getMock() { + return mock; + } + + private MockHandler getMockHandler() { + return mockingDetails.getMockHandler(); } InvocationContainer getInvocationContainer() { return getMockHandler().getInvocationContainer(); } - Object performIntercept(final Object interceptionObject, final Method method, Object[] arguments) throws Throwable { + Object performIntercept(final Object mock, final Method method, Object[] arguments) throws Throwable { - Invocation invocation = createInvocation(interceptionObject, method, arguments); + Invocation invocation = createInvocation(mock, method, arguments); try { return getMockHandler().handle(invocation); @@ -82,7 +89,7 @@ Object performIntercept(final Object interceptionObject, final Method method, Ob } } - private Invocation createInvocation(final Object interceptionObject, final Method method, final Object[] arguments) { - return invocationFactory.createInvocation(interceptionObject, method, arguments); + private Invocation createInvocation(final Object mock, final Method method, final Object[] arguments) { + return invocationFactory.createInvocation(mock, method, getMockHandler().getMockSettings(), arguments); } } diff --git a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockitoMethodInvocationControl.java b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockitoMethodInvocationControl.java index ca81d195a..c5669ffd3 100644 --- a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockitoMethodInvocationControl.java +++ b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/invocation/MockitoMethodInvocationControl.java @@ -18,32 +18,21 @@ import org.mockito.Mockito; import org.mockito.exceptions.base.MockitoAssertionError; -import org.mockito.exceptions.misusing.NotAMockException; -import org.mockito.internal.creation.DelegatingMethod; import org.mockito.internal.debugging.Localized; -import org.mockito.internal.debugging.LocationImpl; import org.mockito.internal.exceptions.stacktrace.StackTraceFilter; -import org.mockito.internal.invocation.InvocationImpl; -import org.mockito.internal.invocation.realmethod.CleanTraceRealMethod; -import org.mockito.internal.invocation.realmethod.RealMethod; import org.mockito.internal.progress.MockingProgress; -import org.mockito.internal.progress.SequenceNumber; import org.mockito.internal.progress.ThreadSafeMockingProgress; import org.mockito.internal.stubbing.InvocationContainerImpl; import org.mockito.internal.verification.VerificationDataImpl; import org.mockito.internal.verification.VerificationModeFactory; -import org.mockito.invocation.Invocation; import org.mockito.verification.VerificationMode; import org.powermock.api.mockito.internal.invocation.InvocationControlAssertionError; import org.powermock.api.mockito.internal.verification.StaticMockAwareVerificationMode; -import org.powermock.api.support.SafeExceptionRethrower; import org.powermock.core.MockGateway; -import org.powermock.core.MockRepository; import org.powermock.core.spi.MethodInvocationControl; import org.powermock.reflect.Whitebox; import org.powermock.reflect.internal.WhiteboxImpl; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Arrays; @@ -115,7 +104,7 @@ private VerificationMode getVerificationModeFromMockProgress(MockingProgress moc } @Override - public Object invoke(final Object obj, final Method method, final Object[] arguments) throws Throwable { + public Object invoke(final Object mock, final Method method, final Object[] arguments) throws Throwable { /* * If we come here and it means that the class has been modified by * PowerMock. If this handler has a delegator (i.e. is in spy mode in @@ -133,10 +122,10 @@ public Object invoke(final Object obj, final Method method, final Object[] argum if (isCanBeHandledByMockito(method) && hasBeenCaughtByMockitoProxy()) { returnValue = MockGateway.PROCEED; } else { - if (isInStaticVerificationMode(obj)) { - handleStaticVerification((Class) obj); + if (isInStaticVerificationMode(mock)) { + handleStaticVerification((Class) mock); } - returnValue = mockHandlerAdaptor.performIntercept(obj, method, arguments); + returnValue = mockHandlerAdaptor.performIntercept(mock, method, arguments); if (returnValue == null) { return MockGateway.SUPPRESS; } diff --git a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/mockmaker/PowerMockMaker.java b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/mockmaker/PowerMockMaker.java index 24e568739..c6f9db72f 100644 --- a/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/mockmaker/PowerMockMaker.java +++ b/powermock-api/powermock-api-mockito2/src/main/java/org/powermock/api/mockito/mockmaker/PowerMockMaker.java @@ -22,7 +22,9 @@ import org.mockito.invocation.MockHandler; import org.mockito.mock.MockCreationSettings; import org.mockito.plugins.MockMaker; +import org.powermock.api.mockito.invocation.MockitoMethodInvocationControl; import org.powermock.configuration.GlobalConfiguration; +import org.powermock.core.MockRepository; /** * A PowerMock implementation of the MockMaker. Right now it simply delegates to the default Mockito @@ -51,7 +53,15 @@ public MockHandler getHandler(Object mock) { if (mock instanceof Class) { return new StaticMockHandler(createStaticMockSettings((Class) mock)); } else { - return mockMaker.getHandler(mock); + final MockitoMethodInvocationControl invocationControl = (MockitoMethodInvocationControl) MockRepository.getInstanceMethodInvocationControl(mock); + final Object realMock; + if (invocationControl == null){ + realMock = mock; + }else{ + realMock = invocationControl.getMockHandlerAdaptor().getMock(); + + } + return mockMaker.getHandler(realMock); } } diff --git a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/spy/SpyTest.java b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/spy/SpyTest.java index b2b2ee250..6fc00a471 100644 --- a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/spy/SpyTest.java +++ b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/spy/SpyTest.java @@ -15,6 +15,7 @@ */ package samples.powermockito.junit4.spy; +import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,12 +46,20 @@ public void setup() throws Exception { } @Test - public void testSpyingOnPrivateMethodWorks() throws Exception { + public void should_stub_spying_on_private_method_works() throws Exception { when(partialMock, "getMyString").thenReturn("ikk2"); assertThat(partialMock.getMyString(), equalTo("ikk2")); assertThat(partialMock.getStringTwo(), equalTo("two")); } + + @Test + public void should_call_real_method_when_spy_method_is_not_stubbed() { + Assertions.assertThat(partialMock.getMyString()) + .as("Real method is called") + .isEqualTo(new SpyObject().getMyString()); + } + @Test public void testSuppressMethodWhenObjectIsSpy() throws Exception { diff --git a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/staticandinstance/StaticAndInstanceDemoTest.java b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/staticandinstance/StaticAndInstanceDemoTest.java index 77b955857..96d5576d7 100644 --- a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/staticandinstance/StaticAndInstanceDemoTest.java +++ b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/staticandinstance/StaticAndInstanceDemoTest.java @@ -27,21 +27,24 @@ @RunWith(PowerMockRunner.class) @PrepareForTest(StaticAndInstanceDemo.class) public class StaticAndInstanceDemoTest { - - @Test - public void partialMockingOfStaticAndInstanceMethod() throws Exception { - spy(StaticAndInstanceDemo.class); - StaticAndInstanceDemo tested = spy(new StaticAndInstanceDemo()); - - final String staticExpected = "a static message"; - when(StaticAndInstanceDemo.getStaticMessage()).thenReturn(staticExpected); - final String privateExpected = "A private message "; - when(tested, "getPrivateMessage").thenReturn(privateExpected); - - String actual = tested.getMessage(); - - verifyStatic(); StaticAndInstanceDemo.getStaticMessage(); - verifyPrivate(tested).invoke("getPrivateMessage"); - assertEquals(privateExpected + staticExpected, actual); - } + + @Test + public void partialMockingOfStaticAndInstanceMethod() throws Exception { + spy(StaticAndInstanceDemo.class); + StaticAndInstanceDemo tested = spy(new StaticAndInstanceDemo()); + + final String staticExpected = "a static message"; + when(StaticAndInstanceDemo.getStaticMessage()).thenReturn(staticExpected); + final String privateExpected = "A private message "; + when(tested, "getPrivateMessage").thenReturn(privateExpected); + + String actual = tested.getMessage(); + + assertEquals(privateExpected + staticExpected, actual); + + verifyStatic(); + StaticAndInstanceDemo.getStaticMessage(); + + verifyPrivate(tested).invoke("getPrivateMessage"); + } } diff --git a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/ServiceLoaderTest.java b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/ServiceLoaderTest.java index 0c8d08aca..671b7f39d 100644 --- a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/ServiceLoaderTest.java +++ b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/ServiceLoaderTest.java @@ -34,7 +34,9 @@ public class ServiceLoaderTest { public void supportsMockingServiceLoader() throws Exception { final ServiceLoader mock = mock(ServiceLoader.class); - doThrow(new IllegalArgumentException("something")).when(mock).reload(); + doThrow(new IllegalArgumentException("something")) + .when(mock) + .reload(); mock.reload(); } diff --git a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/SystemClassUserTest.java b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/SystemClassUserTest.java index 00f1aacd1..fbf8f8c21 100644 --- a/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/SystemClassUserTest.java +++ b/tests/mockito/junit4/src/test/java/samples/powermockito/junit4/system/SystemClassUserTest.java @@ -163,6 +163,7 @@ public void mockingUUIDWorks() throws Exception { final UUID mock = mock(UUID.class); mockStatic(UUID.class); given(UUID.randomUUID()).willReturn(mock); + given(mock.toString()).willCallRealMethod(); // when String actual = new SystemClassUser().generatePerishableToken();