/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import static org.junit.Assert.*; import org.junit.*; @SuppressWarnings({"UnusedDeclaration"}) public final class FullVerificationsTest { public static class Dependency { public void setSomething(int value) {} public void setSomethingElse(char value) {} public boolean editABunchMoreStuff() { return false; } public void notifyBeforeSave() {} public void prepare() {} public void save() {} } @Mocked Dependency mock; private void exerciseCodeUnderTest() { mock.prepare(); mock.setSomething(123); mock.setSomethingElse('a'); mock.setSomething(45); mock.editABunchMoreStuff(); mock.notifyBeforeSave(); mock.save(); } @Test public void verifyAllInvocations() { exerciseCodeUnderTest(); new FullVerifications() {{ mock.prepare(); minTimes = 1; mock.editABunchMoreStuff(); mock.notifyBeforeSave(); maxTimes = 1; mock.setSomething(anyInt); minTimes = 0; maxTimes = 2; mock.setSomethingElse(anyChar); mock.save(); times = 1; }}; } @Test public void verifyAllInvocationsWithSomeOfThemRecorded() { new NonStrictExpectations() {{ mock.editABunchMoreStuff(); result = true; mock.setSomething(45); }}; exerciseCodeUnderTest(); new FullVerifications() {{ mock.prepare(); mock.setSomething(anyInt); mock.setSomethingElse(anyChar); mock.editABunchMoreStuff(); mock.notifyBeforeSave(); mock.save(); }}; } @Test public void verifyAllInvocationsWithThoseRecordedAsExpectedToOccurVerifiedImplicitly() { new NonStrictExpectations() {{ mock.setSomething(45); times = 1; mock.editABunchMoreStuff(); result = true; minTimes = 1; }}; exerciseCodeUnderTest(); new FullVerifications() {{ mock.prepare(); mock.setSomething(123); mock.setSomethingElse(anyChar); mock.notifyBeforeSave(); mock.save(); }}; } @Test public void verifyAllInvocationsExceptThoseAlreadyVerifiedInAPreviousVerificationBlock() { exerciseCodeUnderTest(); new Verifications() {{ mock.setSomething(45); mock.editABunchMoreStuff(); }}; new FullVerifications() {{ mock.prepare(); mock.setSomething(123); mock.setSomethingElse(anyChar); mock.notifyBeforeSave(); mock.save(); }}; } @Test(expected = AssertionError.class) public void verifyAllInvocationsWithOneMissing() { exerciseCodeUnderTest(); new FullVerifications() {{ mock.prepare(); mock.notifyBeforeSave(); mock.setSomething(anyChar); mock.setSomethingElse(anyChar); mock.save(); }}; } @Test public void verifyUnrecordedInvocationThatWasExpectedToNotHappen() { mock.prepare(); mock.setSomething(123); mock.setSomething(45); new FullVerifications() {{ mock.prepare(); mock.setSomething(anyInt); times = 2; mock.notifyBeforeSave(); times = 0; }}; } @Test(expected = AssertionError.class) public void verifyUnrecordedInvocationThatShouldNotHappenButDoes() { mock.setSomething(1); mock.notifyBeforeSave(); new FullVerifications() {{ mock.setSomething(1); mock.notifyBeforeSave(); times = 0; }}; } @Test public void verifyInvocationThatIsAllowedToHappenAnyNumberOfTimesAndHappensOnce() { mock.prepare(); mock.setSomething(123); mock.save(); new FullVerifications() {{ mock.prepare(); mock.setSomething(anyInt); mock.save(); minTimes = 0; }}; } @Test public void verifyRecordedInvocationThatIsAllowedToHappenAnyNoOfTimesAndDoesNotHappen() { new NonStrictExpectations() {{ mock.save(); }}; mock.prepare(); mock.setSomething(123); new FullVerifications() {{ mock.prepare(); mock.setSomething(anyInt); mock.save(); minTimes = 0; }}; } @Test public void verifyUnrecordedInvocationThatIsAllowedToHappenAnyNoOfTimesAndDoesNotHappen() { mock.prepare(); mock.setSomething(123); new FullVerifications() {{ mock.prepare(); mock.setSomething(anyInt); mock.save(); minTimes = 0; }}; } @Test(expected = AssertionError.class) public void verifyUnrecordedInvocationThatShouldHappenButDoesNot() { mock.setSomething(1); new FullVerifications() {{ mock.notifyBeforeSave(); }}; } @Test(expected = AssertionError.class) public void verifyRecordedInvocationThatShouldHappenButDoesNot() { new NonStrictExpectations() {{ mock.notifyBeforeSave(); }}; mock.setSomething(1); new FullVerifications() {{ mock.notifyBeforeSave(); }}; } @Test(expected = AssertionError.class) public void verifyAllInvocationsWithExpectationRecordedButOneInvocationUnverified() { new NonStrictExpectations() {{ mock.setSomething(anyInt); }}; mock.setSomething(123); mock.editABunchMoreStuff(); mock.setSomething(45); new FullVerifications() {{ mock.setSomething(withNotEqual(123)); mock.editABunchMoreStuff(); }}; } @Ignore @Test public void verifyTwoInvocationsWithIteratingBlockHavingExpectationRecordedAndSecondInvocationUnverified() { new NonStrictExpectations() {{ mock.setSomething(anyInt); }}; mock.setSomething(123); mock.setSomething(45); try { new FullVerifications(2) {{ mock.setSomething(123); }}; fail(); } catch (AssertionError e) { assertTrue(e.getMessage().contains("Missing 1 invocation")); } } @Test(expected = AssertionError.class) public void verifyAllInvocationsWithExtraVerification() { mock.prepare(); mock.setSomething(123); new FullVerifications() {{ mock.prepare(); mock.setSomething(123); mock.notifyBeforeSave(); }}; } @Test(expected = AssertionError.class) public void verifyAllInvocationsWithInvocationCountOneLessThanActual() { mock.setSomething(123); mock.setSomething(45); new FullVerifications() {{ mock.setSomething(anyInt); times = 1; }}; } @Test(expected = AssertionError.class) public void verifyAllInvocationsWithInvocationCountTwoLessThanActual() { mock.setSomething(123); mock.setSomething(45); mock.setSomething(0); new FullVerifications() {{ mock.setSomething(anyInt); times = 1; }}; } @Test(expected = AssertionError.class) public void verifyAllInvocationsWithInvocationCountMoreThanActual() { mock.setSomethingElse('f'); new FullVerifications() {{ mock.setSomethingElse(anyChar); times = 3; }}; } @Test public void verifyAllInvocationsInIteratingBlock() { mock.setSomething(123); mock.save(); mock.setSomething(45); mock.save(); new FullVerifications(2) {{ mock.setSomething(anyInt); mock.save(); }}; } @Test(expected = AssertionError.class) public void verifySingleInvocationInBlockWithLargerNumberOfIterations() { mock.setSomething(123); new FullVerifications(3) {{ mock.setSomething(123); }}; } @Test(expected = AssertionError.class) public void verifyMultipleInvocationsInBlockWithSmallerNumberOfIterations() { mock.setSomething(123); mock.setSomething(-14); new FullVerifications(1) {{ mock.setSomething(anyInt); }}; } @Test public void verifyWithArgumentMatcherAndIndividualInvocationCountsInIteratingBlock() { for (int i = 0; i < 2; i++) { exerciseCodeUnderTest(); } new FullVerifications(2) {{ mock.prepare(); maxTimes = 1; mock.setSomething(anyInt); minTimes = 2; mock.setSomethingElse('a'); mock.editABunchMoreStuff(); minTimes = 0; maxTimes = 5; mock.notifyBeforeSave(); mock.save(); times = 1; }}; } @Test(expected = AssertionError.class) public void verifyNoInvocationsOccurredOnMockedDependencyWithOneHavingOccurred() { mock.editABunchMoreStuff(); new FullVerifications() {}; } @Test public void verifyNoInvocationsOnMockedDependencyBeyondThoseRecordedAsExpected() { new NonStrictExpectations() {{ mock.prepare(); times = 1; }}; new NonStrictExpectations() {{ mock.setSomething(anyInt); minTimes = 1; mock.save(); times = 1; }}; mock.prepare(); mock.setSomething(1); mock.setSomething(2); mock.save(); new FullVerifications() {}; } @Test public void verifyNoInvocationsOnMockedDependencyBeyondThoseRecordedAsExpectedWithOneHavingOccurred() { new NonStrictExpectations() {{ mock.prepare(); times = 1; mock.save(); minTimes = 1; }}; mock.prepare(); mock.editABunchMoreStuff(); mock.save(); try { new FullVerifications() {}; fail(); } catch (AssertionError e) { assertTrue(e.getMessage().contains("editABunchMoreStuff()")); } } }