/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package integrationTests.serviceA; import integrationTests.serviceB.*; import static mockit.Mockit.*; import static org.junit.Assert.*; import org.junit.*; import mockit.*; public final class ServiceATest { @Before public void setUp() { setUpMocks(MockServiceBThatAvoidsStaticInitialization.class); } @MockClass(realClass = ServiceB.class) public static final class MockServiceBThatAvoidsStaticInitialization { @Mock public static void $clinit() { // Do nothing. } } @Test public void serviceBCalledExactlyOnce() { setUpMocks(MockServiceBForOneInvocation.class); boolean result = new ServiceA().doSomethingThatUsesServiceB(2, "test"); assertTrue(result); } @MockClass(realClass = ServiceB.class) public static class MockServiceBForOneInvocation { @Mock(invocations = 1) public int computeX(int a, int b) { // Asserts that the received arguments meets the expected values. // Equivalent jMock2 expectations: one(mockOfServiceB).computeX(2, 5); assertEquals(2, a); assertEquals(5, b); // Returns the expected result. // Equivalent jMock2 expectation: will(returnValue(7)); return 7; } } @SuppressWarnings({"JUnitTestMethodWithNoAssertions"}) @Test public void serviceBCalledAtLeastTwoTimes() { setUpMocks(new MockServiceBForTwoInvocations()); new ServiceA().doSomethingElseUsingServiceB(3); } @MockClass(realClass = ServiceB.class) public static final class MockServiceBForTwoInvocations { @Mock(minInvocations = 2) public int computeX(int a, int b) { assertTrue(a + b >= 0); return 0; } } @Test public void serviceBCalledAtLeastOnceAndAtMostThreeTimes() { setUpMocks(new MockServiceBForOneToThreeInvocations(), MockServiceBHelper.class); ServiceA serviceA = new ServiceA(); serviceA.doSomethingElseUsingServiceB(2); String config = serviceA.getConfig(); assertEquals("test", config); } @MockClass(realClass = ServiceB.class) public static final class MockServiceBForOneToThreeInvocations { public ServiceB it; @Mock(invocations = 1) public void $init(String config) { assertNotNull(it); assertEquals("config", config); } @Mock(minInvocations = 1, maxInvocations = 3) public int computeX(int a, int b) { assertTrue(a + b >= 0); assertNotNull(it); return a - b; } @Mock(reentrant = true) public String getConfig() { String config = it.getConfig(); assertNull(config); return "test"; } } @MockClass(realClass = ServiceB.Helper.class) static class MockServiceBHelper { @Mock(invocations = 0) void $init() { throw new IllegalStateException("should not be created"); } } @Test public void beforeAdvice() { setUpMocks(new OnEntryTracingAspect()); ServiceB b = new ServiceB("test"); assertEquals(3, b.computeX(1, 2)); assertEquals(5, b.computeX(2, 3)); assertEquals(-10, b.computeX(0, -10)); } @MockClass(realClass = ServiceB.class) public static class OnEntryTracingAspect { public ServiceB it; @Mock(reentrant = true) public int computeX(int a, int b) { return it.computeX(a, b); } } @Test public void afterAdvice() { setUpMocks(new OnExitTracingAspect()); ServiceB b = new ServiceB("test"); assertEquals(3, b.computeX(1, 2)); assertEquals(5, b.computeX(2, 3)); assertEquals(-10, b.computeX(0, -10)); } @MockClass(realClass = ServiceB.class) public static class OnExitTracingAspect { public ServiceB it; @Mock(reentrant = true) public int computeX(int a, int b) { Integer x; try { x = it.computeX(a, b); return x; } finally { // Statements to be executed on exit would be here. x = a + b; } } } @Test public void aroundAdvice() { setUpMocks(new TracingAspect()); ServiceB b = new ServiceB("test"); assertEquals(3, b.computeX(1, 2)); assertEquals(5, b.computeX(2, 3)); assertEquals(-10, b.computeX(0, -10)); } @MockClass(realClass = ServiceB.class) public static class TracingAspect { public ServiceB it; @Mock(reentrant = true) public int computeX(int a, int b) { int x = it.computeX(a, b); return x; } } }