diff --git a/spring-aspects/src/main/java/org/springframework/mock/staticmock/AbstractMethodMockingControl.aj b/spring-aspects/src/main/java/org/springframework/mock/staticmock/AbstractMethodMockingControl.aj index e8fae8d097f..f0010febcac 100644 --- a/spring-aspects/src/main/java/org/springframework/mock/staticmock/AbstractMethodMockingControl.aj +++ b/spring-aspects/src/main/java/org/springframework/mock/staticmock/AbstractMethodMockingControl.aj @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,16 +18,22 @@ package org.springframework.mock.staticmock; import java.util.Arrays; import java.util.LinkedList; -import java.util.List; + +import org.springframework.util.ObjectUtils; /** * Abstract aspect to enable mocking of methods picked out by a pointcut. - * Sub-aspects must define the mockStaticsTestMethod() pointcut to - * indicate call stacks when mocking should be triggered, and the - * methodToMock() pointcut to pick out a method invocations to mock. + * + *
Sub-aspects must define: + *
Mocking will occur in the call stack of any method in a class (typically a test class) - * that is annotated with the {@code @MockStaticEntityMethods} annotation. + *
Mocking will occur within the call stack of any method in a class (typically a + * test class) that is annotated with {@code @MockStaticEntityMethods}. * - *
Also provides static methods to simplify the programming model for - * entering playback mode and setting expected return values. + *
This aspect also provides static methods to simplify the programming model for + * setting expectations and entering playback mode. * *
Usage: *
See {@code AnnotationDrivenStaticEntityMockingControl} for details. + *
See {@link AnnotationDrivenStaticEntityMockingControl} for details. * * @author Rod Johnson + * @author Sam Brannen */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/spring-aspects/src/test/java/org/springframework/mock/staticmock/AnnotationDrivenStaticEntityMockingControlTests.java b/spring-aspects/src/test/java/org/springframework/mock/staticmock/AnnotationDrivenStaticEntityMockingControlTests.java index 8c99d269f27..4993fbc2970 100644 --- a/spring-aspects/src/test/java/org/springframework/mock/staticmock/AnnotationDrivenStaticEntityMockingControlTests.java +++ b/spring-aspects/src/test/java/org/springframework/mock/staticmock/AnnotationDrivenStaticEntityMockingControlTests.java @@ -16,16 +16,18 @@ package org.springframework.mock.staticmock; +import java.rmi.RemoteException; + import javax.persistence.PersistenceException; -import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.*; import static org.springframework.mock.staticmock.AnnotationDrivenStaticEntityMockingControl.*; /** - * Tests for static entity mocking framework. + * Tests for Spring's static entity mocking framework (i.e., @{@link MockStaticEntityMethods} + * and {@link AnnotationDrivenStaticEntityMockingControl}). * * @author Rod Johnson * @author Ramnivas Laddad @@ -34,10 +36,8 @@ import static org.springframework.mock.staticmock.AnnotationDrivenStaticEntityMo @MockStaticEntityMethods public class AnnotationDrivenStaticEntityMockingControlTests { - // TODO Fix failing test - @Ignore @Test - public void noArgIntReturn() { + public void noArgumentMethodInvocationReturnsInt() { int expectedCount = 13; Person.countPeople(); expectReturn(expectedCount); @@ -45,20 +45,16 @@ public class AnnotationDrivenStaticEntityMockingControlTests { assertEquals(expectedCount, Person.countPeople()); } - // TODO Fix failing test - @Ignore @Test(expected = PersistenceException.class) - public void noArgThrows() { + public void noArgumentMethodInvocationThrowsException() { Person.countPeople(); expectThrow(new PersistenceException()); playback(); Person.countPeople(); } - // TODO Fix failing test - @Ignore @Test - public void argMethodMatches() { + public void methodArgumentsMatch() { long id = 13; Person found = new Person(); Person.findPerson(id); @@ -67,8 +63,6 @@ public class AnnotationDrivenStaticEntityMockingControlTests { assertEquals(found, Person.findPerson(id)); } - // TODO Fix failing test - @Ignore @Test public void longSeriesOfCalls() { long id1 = 13; @@ -91,36 +85,26 @@ public class AnnotationDrivenStaticEntityMockingControlTests { assertEquals(0, Person.countPeople()); } - /** - * Note delegation is used when tests are invalid and should fail, as otherwise the - * failure will occur on the verify() method in the aspect after this method returns, - * failing the test case. - */ - // TODO Fix failing test - @Ignore - @Test - public void argMethodNoMatchExpectReturn() { - try { - new Delegate().argMethodNoMatchExpectReturn(); - fail(); - } - catch (IllegalArgumentException expected) { - } - } - - // TODO Fix failing test - @Ignore @Test(expected = IllegalArgumentException.class) - public void argMethodNoMatchExpectThrow() { - new Delegate().argMethodNoMatchExpectThrow(); + public void methodArgumentsDoNotMatchAndReturnsObject() { + long id = 13; + Person found = new Person(); + Person.findPerson(id); + AnnotationDrivenStaticEntityMockingControl.expectReturn(found); + AnnotationDrivenStaticEntityMockingControl.playback(); + assertEquals(found, Person.findPerson(id + 1)); } - private void called(Person found, long id) { - assertEquals(found, Person.findPerson(id)); + @Test(expected = IllegalArgumentException.class) + public void methodArgumentsDoNotMatchAndThrowsException() { + long id = 13; + Person found = new Person(); + Person.findPerson(id); + AnnotationDrivenStaticEntityMockingControl.expectThrow(new PersistenceException()); + AnnotationDrivenStaticEntityMockingControl.playback(); + assertEquals(found, Person.findPerson(id + 1)); } - // TODO Fix failing test - @Ignore @Test public void reentrant() { long id = 13; @@ -131,31 +115,56 @@ public class AnnotationDrivenStaticEntityMockingControlTests { called(found, id); } + private void called(Person found, long id) { + assertEquals(found, Person.findPerson(id)); + } + @Test(expected = IllegalStateException.class) public void rejectUnexpectedCall() { - new Delegate().rejectUnexpectedCall(); + AnnotationDrivenStaticEntityMockingControl.playback(); + Person.countPeople(); } - // TODO Fix failing test - @Ignore @Test(expected = IllegalStateException.class) - public void failTooFewCalls() { - new Delegate().failTooFewCalls(); + public void tooFewCalls() { + long id = 13; + Person found = new Person(); + Person.findPerson(id); + AnnotationDrivenStaticEntityMockingControl.expectReturn(found); + Person.countPeople(); + AnnotationDrivenStaticEntityMockingControl.expectReturn(25); + AnnotationDrivenStaticEntityMockingControl.playback(); + assertEquals(found, Person.findPerson(id)); } @Test public void empty() { - // Test that verification check doesn't blow up if no replay() call happened + // Test that verification check doesn't blow up if no replay() call happened. } @Test(expected = IllegalStateException.class) - public void doesntEverReplay() { - new Delegate().doesntEverReplay(); + public void doesNotEnterPlaybackMode() { + Person.countPeople(); } @Test(expected = IllegalStateException.class) - public void doesntEverSetReturn() { - new Delegate().doesntEverSetReturn(); + public void doesNotSetExpectedReturnValue() { + Person.countPeople(); + AnnotationDrivenStaticEntityMockingControl.playback(); + } + + /** + * Note: this test method currently does NOT actually verify that the mock + * verification fails. + */ + // TODO Determine if it's possible for a mock verification failure to fail a test in + // JUnit 4+ if the test method itself throws an expected exception. + @Test(expected = RemoteException.class) + public void verificationFailsEvenWhenTestFailsInExpectedManner() throws Exception { + Person.countPeople(); + AnnotationDrivenStaticEntityMockingControl.playback(); + // No calls in order to allow verification failure + throw new RemoteException(); } } diff --git a/spring-aspects/src/test/java/org/springframework/mock/staticmock/Delegate.java b/spring-aspects/src/test/java/org/springframework/mock/staticmock/Delegate.java deleted file mode 100644 index 2a2475165aa..00000000000 --- a/spring-aspects/src/test/java/org/springframework/mock/staticmock/Delegate.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2002-2014 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.mock.staticmock; - -import java.rmi.RemoteException; - -import javax.persistence.PersistenceException; - -import org.junit.Ignore; - -import static org.junit.Assert.*; - -/** - * This isn't meant for direct testing; rather it is driven from - * {@link AnnotationDrivenStaticEntityMockingControlTests}. - * - * @author Rod Johnson - * @author Ramnivas Laddad - * @author Sam Brannen - */ -@MockStaticEntityMethods -@Ignore("Used because verification failures occur after method returns, so we can't test for them in the test case itself") -public class Delegate { - - public void argMethodNoMatchExpectReturn() { - long id = 13; - Person found = new Person(); - Person.findPerson(id); - AnnotationDrivenStaticEntityMockingControl.expectReturn(found); - AnnotationDrivenStaticEntityMockingControl.playback(); - assertEquals(found, Person.findPerson(id + 1)); - } - - public void argMethodNoMatchExpectThrow() { - long id = 13; - Person found = new Person(); - Person.findPerson(id); - AnnotationDrivenStaticEntityMockingControl.expectThrow(new PersistenceException()); - AnnotationDrivenStaticEntityMockingControl.playback(); - assertEquals(found, Person.findPerson(id + 1)); - } - - public void failTooFewCalls() { - long id = 13; - Person found = new Person(); - Person.findPerson(id); - AnnotationDrivenStaticEntityMockingControl.expectReturn(found); - Person.countPeople(); - AnnotationDrivenStaticEntityMockingControl.expectReturn(25); - AnnotationDrivenStaticEntityMockingControl.playback(); - assertEquals(found, Person.findPerson(id)); - } - - public void doesntEverReplay() { - Person.countPeople(); - } - - public void doesntEverSetReturn() { - Person.countPeople(); - AnnotationDrivenStaticEntityMockingControl.playback(); - } - - public void rejectUnexpectedCall() { - AnnotationDrivenStaticEntityMockingControl.playback(); - Person.countPeople(); - } - - public void verificationFailsEvenWhenTestFailsInExpectedManner() - throws RemoteException { - Person.countPeople(); - AnnotationDrivenStaticEntityMockingControl.playback(); - // No calls to allow verification failure - throw new RemoteException(); - } - -}