/* * Copyright (c) 2006 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import java.util.*; import javax.annotation.*; import static org.junit.Assert.*; import org.junit.*; public final class TestedClassWithConstructorDI1Test { public static class BaseTestedClass { static int baseCounter; @PostConstruct void initializeBase() { baseCounter++; } @PreDestroy void destroyBase() { baseCounter++; } } public static final class TestedClass extends BaseTestedClass { static int counter; private final Dependency dependency; private final Runnable runnable; private final Observable observable; public TestedClass(Dependency dependency) { this(dependency, null, null); } public TestedClass(Dependency dependency, Runnable runnable) { this(dependency, runnable, null); } public TestedClass(Dependency dependency, Observable observable) { this(dependency, null, observable); } public TestedClass(Dependency dependency, Runnable runnable, Observable observable) { this.dependency = dependency; this.runnable = runnable; this.observable = observable; } public boolean doSomeOperation() { if (runnable != null) { runnable.run(); } boolean b = dependency.doSomething() > 0; if (b && observable != null) { observable.notifyObservers(); } return b; } @PostConstruct void initialize() { counter++; } @PreDestroy void destroy() { counter++; } } static class Dependency { int doSomething() { return -1; } } @Tested TestedClass tested; @Injectable Dependency mock; @Test public void exerciseTestedObjectWithSingleDependencyInjectedThroughConstructor() { assertTestedObjectWasInitialized(); new Expectations() {{ mock.doSomething(); result = 23; }}; assertTrue(tested.doSomeOperation()); } @Test public void exerciseTestedObjectWithTwoDependenciesInjectedThroughConstructor(@Injectable final Runnable mock2) { assertTestedObjectWasInitialized(); new Expectations() {{ mock.doSomething(); result = 23; }}; assertTrue(tested.doSomeOperation()); new Verifications() {{ mock2.run(); }}; } @Test public void exerciseTestedObjectWithTwoOtherDependenciesInjectedThroughConstructor(@Injectable final Observable obs) { assertTestedObjectWasInitialized(); new Expectations() {{ mock.doSomething(); result = 123; }}; assertTrue(tested.doSomeOperation()); new FullVerifications() {{ obs.notifyObservers(); }}; } @Test public void exerciseTestedObjectWithAllDependenciesInjectedThroughConstructor( @Injectable final Runnable mock2, @Injectable final Observable mock3) { assertTestedObjectWasInitialized(); new Expectations() {{ mock.doSomething(); result = 123; }}; assertTrue(tested.doSomeOperation()); new FullVerificationsInOrder() {{ mock2.run(); mock3.notifyObservers(); }}; } @Before public void resetCounter() { BaseTestedClass.baseCounter = 0; TestedClass.counter = 0; } void assertTestedObjectWasInitialized() { assertEquals(1, BaseTestedClass.baseCounter); assertEquals(1, TestedClass.counter); } @After public void verifyTestedObjectAfterEveryTest() { assertEquals(2, BaseTestedClass.baseCounter); assertEquals(2, TestedClass.counter); } }