/* * Copyright (c) 2006 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import java.net.*; import javax.servlet.*; import org.junit.*; import static org.junit.Assert.*; public final class TestedClassWithConstructorDI2Test { public static final class TestedClass implements Servlet { static int counter; private ServletConfig config; private final Dependency dependency1; private final Dependency dependency2; private final Dependency dependency3; public TestedClass(Dependency dependency1, Runnable r, Dependency dependency2, Dependency dependency3) { this.dependency1 = dependency1; this.dependency2 = dependency2; this.dependency3 = dependency3; r.run(); int i = dependency1.doSomething(); assert i == 123; try { InetAddress localHost = InetAddress.getLocalHost(); assert localHost.getHostName() == null; } catch (UnknownHostException e) { throw new IllegalStateException("InetAddress should be mocked", e); } } public int doSomeOperation() { return dependency1.doSomething() + dependency2.doSomething(); } @Override public ServletConfig getServletConfig() { return config; } @Override public void service(ServletRequest req, ServletResponse res) {} @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig cfg) { config = cfg; counter++; int i = dependency1.doSomething(); assert i == 123; checkInetAddressMocking(); } private void checkInetAddressMocking() { try { InetAddress inetAddress = InetAddress.getByName("testHost"); assert inetAddress.getHostName() == null; } catch (UnknownHostException ignore) { counter = -1; } } @Override public void destroy() { counter++; checkInetAddressMocking(); } } static class Dependency { int doSomething() { return -1; } } @Tested TestedClass tested; @Injectable Runnable task; @Injectable Dependency dependency1; @Injectable Dependency dependency2; @Injectable ServletConfig config; @Mocked InetAddress testHost; @Before public void resetCounter() { TestedClass.counter = 0; new Expectations() {{ dependency1.doSomething(); result = 123; }}; } @Test public void exerciseTestedObjectWithDependenciesOfSameTypeInjectedThroughConstructor( @Injectable Dependency dependency3) { assertTestedObjectWasInitialized(); assertSame(dependency3, tested.dependency3); new Expectations() {{ dependency1.doSomething(); result = 23; dependency2.doSomething(); result = 5; }}; assertEquals(28, tested.doSomeOperation()); } @Test public void exerciseTestedObjectWithExtraInjectableParameter( @Injectable Dependency dependency3, @Injectable Dependency mock4) { assertTestedObjectWasInitialized(); assertSame(dependency1, tested.dependency1); assertSame(dependency2, tested.dependency2); assertSame(dependency3, tested.dependency3); } void assertTestedObjectWasInitialized() { assertSame(config, tested.getServletConfig()); assertEquals(1, TestedClass.counter); } @After public void verifyTestedObjectAfterEveryTest() { assertEquals(2, TestedClass.counter); } }