/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package integrationTests; import java.io.*; import java.util.*; import static java.util.Arrays.*; import static java.util.Collections.*; import static mockit.Mockit.*; import static org.junit.Assert.*; import org.junit.*; import mockit.*; @SuppressWarnings({"UnusedDeclaration", "ClassWithTooManyMethods"}) public final class CTest { private String testData; @Test public void packageVoidNoArgs() { setUpMock(C.class, E.class); E.noReturnCalled = false; C c = new C(); c.noReturn(); assertTrue("noReturn() wasn't called", E.noReturnCalled); } public static class E { static boolean noReturnCalled; @Mock public int i() { System.out.println("E.i"); return 2; } @Mock public void noReturn() { noReturnCalled = true; } } @Test public void protectedVoid1Arg() { F f = new F(); setUpMock(C.class, f); C c = new C(); c.setSomeValue("test"); assertEquals("mock setSomeValue not called", "test", f.someValue); } public static class F { String someValue = ""; @Mock public void setSomeValue(String someValue) { this.someValue = someValue; } } @Test public void primitiveLongAndIntParameters() { setUpMocks(PrimitiveLongAndIntParametersMock.class); PrimitiveLongAndIntParametersMock.sum = 0; C.validateValues(1L, 2); assertEquals(3L, PrimitiveLongAndIntParametersMock.sum); } @MockClass(realClass = C.class) public static class PrimitiveLongAndIntParametersMock { static long sum; @Mock public static void validateValues(long v1, int v2) { sum = v1 + v2; } } @Test public void primitiveNumericParameters() { setUpMock(C.class, new Object() { @Mock public double sumValues(byte v1, short v2, int v3, long v4, float v5, double v6) { return 0.0; } }); double sum = new C().sumValues((byte) 1, (short) 2, 3, 4L, 5.0F, 6.0); assertEquals(0.0, sum, 0.0); } @Test public void defaultConstructor() { //noinspection InstantiationOfUtilityClass setUpMock(C.class, new DefaultConstructorMock()); DefaultConstructorMock.x = 0; new C(); assertEquals(1, DefaultConstructorMock.x); } public static class DefaultConstructorMock { static int x; @Mock public void $init() { x = 1; } } @Test public void constructor1Arg() { setUpMocks(F2.class); C c = new C("test"); assertNull(c.getSomeValue()); } @MockClass(realClass = C.class) public static class F2 { @Mock public void $init(String someValue) { // do nothing } } @Test public void twoConstructorsWithMultipleArgs() { setUpMock(RealClassWithTwoConstructors.class, new MockConstructors()); new RealClassWithTwoConstructors("a", 'b'); assertEquals("ab", testData); new RealClassWithTwoConstructors("a", 'b', 1); assertEquals("ab1", testData); } public static class RealClassWithTwoConstructors { RealClassWithTwoConstructors(String a, char b) {} RealClassWithTwoConstructors(String a, char b, int c) {} } final class MockConstructors { @Mock void $init(String a, char b) { testData = a + b; } @Mock void $init(String a, char b, int c) { testData = a + b + c; } } @Test public void privateStaticVoidNoArgs() { //noinspection InstantiationOfUtilityClass setUpMocks(new H()); C.printText(); assertEquals("H.doPrintText", C.printedText); } @MockClass(realClass = C.class) public static class H { @Mock public static void doPrintText() { C.printedText = "H.doPrintText"; } } @Test public void staticVoid1ArgOverload() { setUpMock(C.class.getName(), H2.class); C.printedText = ""; C.printText("mock"); assertEquals("", C.printedText); } public static class H2 { @Mock public static void printText(String text) { assertEquals("mock", text); } } @Test public void int1ArgWithWildcard() { setUpMock(C.class, new I()); Collection<String> names = asList("abc", "G20", "xyz"); int c = new C().count(names); assertEquals(0, c); } public static class I { @Mock public int count(Collection<?> items) { return 0; } } @Test public void genericList2Args() { setUpMock(C.class, J.class); Collection<String> names = asList("abc", "G20", "xyz"); names = new C().orderBy(names, false); //noinspection AssertEqualsBetweenInconvertibleTypes assertEquals(emptyList(), names); } public static class J { @Mock public <E extends Comparable<E>> List<E> orderBy(Collection<E> items, boolean asc) { return emptyList(); } } @Test public void throwsException() throws FileNotFoundException { setUpMock(C.class, K.class); new C().loadFile("temp"); // no exception expected assertTrue(K.executed); } public static class K { static boolean executed; @Mock public void loadFile(String name) { executed = true; } } @Test public void throwsRuntimeException() throws FileNotFoundException { setUpMock(C.class, L.class); try { new C().loadFile("temp"); fail(); } catch (IllegalArgumentException ignore) { // passed } } public static class L { @Mock public void loadFile(String name) throws FileNotFoundException { throw new IllegalArgumentException(); } } @Test(expected = TooManyListenersException.class) public void throwsCheckedExceptionNotInThrowsOfRealMethod() throws Exception { setUpMock(C.class, MockThrowingCheckedExceptionNotInRealMethodThrowsClause.class); new C().loadFile("test"); fail(); } public static class MockThrowingCheckedExceptionNotInRealMethodThrowsClause { @Mock public void loadFile(String name) throws TooManyListenersException { throw new TooManyListenersException(); } } @Test public void varargs() { setUpMock(C.class, M.class); new C().printArgs(1, true, "test"); assertEquals("mock", C.printedText); } public static class M { @Mock public void printArgs(Object... args) { C.printedText = "mock"; } } @Test public void testRedefineOneClassTwoTimes() { setUpMock(C.class, D.class); boolean b = C.b(); assertFalse(b); setUpMock(C.class, D.class); boolean b2 = C.b(); assertFalse(b2); } public static final class D { @Mock public static boolean b() { return false; } } @Test public void redefineOneClassThreeTimes() { setUpMock(Ct.class, Cf.class); assertFalse(Ct.b()); setUpMock(Ct.class, Ce.class); setUpMock(Ct.class, Ce.class); setUpMock(Ct.class, Cf.class); assertFalse(Ct.b()); } public static class Ct { @Mock public static boolean b() { return true; } } public static class Cf { @Mock public static boolean b() { return false; } } public static class Ce { @Mock public static boolean b() { return true; }} @Test public void redefineMultipleClasses() { setUpMock(C.class, D.class); setUpMock(C2.class, N.class); boolean b = C.b(); assertFalse(b); List<C2> c2Found = new C().findC2(); assertNull(c2Found.get(0).getCode()); } public static class N { @Mock public String getCode() { return null; } } @Test public void mockInstanceState() { O mock = new O(); setUpMock(C.class, mock); C c = new C("some data"); assertEquals(mock.value, c.getSomeValue()); } public static class O { String value = "mock data"; @Mock public String getSomeValue() { return value; } } @Test public void twoMockInstances() { P mock1 = new P(new C2(123, "one23")); setUpMock(C.class, mock1); C2Mock mock2 = new C2Mock(); mock2.code = "mock2"; setUpMock(C2.class, mock2); List<C2> c2Found = new C().findC2(); assertEquals(mock1.data, c2Found); C2 c2 = c2Found.get(0); assertEquals(mock2.code, c2.getCode()); } public static class P { List<C2> data; P(C2... data) { this.data = asList(data); } @Mock public List<C2> findC2() { return data; } } public class C2Mock { private String code; C2Mock() {} @Mock public String getCode() { return code; } } @Test public void redefineMethodsWithInnerMockClass() { try { setUpMock(C2.class, C2Mock.class); fail(); } catch (IllegalArgumentException e) { // OK } } // Redefines the same as C2Mock, since inherited public methods ARE also considered. public class C3Mock extends C2Mock { C3Mock() {} } @Test public void redefineMethodsWithExtendedMockClass() { setUpMock(C2.class, new C3Mock()); C2 c2 = new C2(12, "c2"); assertNull(c2.getCode()); } @Test public void mockInstanceOfAnonymousInnerClass() { setUpMock(C.class, new Object() { @Mock public String getSomeValue() { return "test data"; } }); C c = new C("some data"); assertEquals("test data", c.getSomeValue()); } @Test public void mockInstanceOfAnonymousInnerClassUsingParentData() { //noinspection serial setUpMock(C.class, new Serializable() { @Mock public String getSomeValue() { return testData; } }); testData = "my test data"; C c = new C("some data"); assertEquals(testData, c.getSomeValue()); } @Test public void accessToInstanceUnderTest() { setUpMock(C.class, new Object() { // Instance under test. Warning: calling redefined methods may lead to infinite recursion! C it; @Mock @Override public String toString() { return it.getSomeValue().toUpperCase(); } }); String value = new C("test data").toString(); assertEquals("TEST DATA", value); } @Test public void attemptToMockNonExistentMethodInRealClass() { try { setUpMock(C.class, ClassWithMockMethodForNonExistentRealMethod.class); fail("Should have thrown " + IllegalArgumentException.class); } catch (IllegalArgumentException e) { // OK } } public static class ClassWithMockMethodForNonExistentRealMethod { @Mock public void nonExistent() {} int helperMethodNotIntendedAsMock(String s) { return s.length(); } } @Test public void mockJREClasses() { setUpMock(Date.class, new MockDate()); assertEquals(0L, new Date().getTime()); assertTrue(new Date().before(null)); setUpMock(Date.class, MockDate.class); assertEquals(0L, new Date().getTime()); assertTrue(new Date().before(null)); setUpMock(String.class, MockString.class); assertEquals("0", String.valueOf(1.2)); assertEquals("1", String.valueOf(5.0f)); setUpMock(String.class, new MockString()); assertEquals("0", String.valueOf(1.2)); assertEquals("1", String.valueOf(5.0f)); } public static class MockDate { @Mock public long getTime() { return 0L; } @Mock public static boolean before(Date d) { return true; } } public static class MockString { @Mock public static String valueOf(double d) { return "0"; } @Mock public String valueOf(float f) { return "1"; } } @Test public void staticMockMethodForNonStaticRealMethod() { setUpMock(CX.class, C4Mock.class); int i = new CX().i(""); assertEquals(2, i); } public static class C4Mock { @Mock public static int i(String s) { return 2; } } @Test public void nonStaticMockMethodForStaticRealMethod() { setUpMock(CX.class, new CXMock()); boolean b = CX.b(""); assertFalse(b); } public static class CX { public int i(String s) { return 1; } public static boolean b(String s) { return true; } } public class CXMock { CXMock() {} @Mock public boolean b(String s) { return false; } } @Test public void mockMethodWithDifferentReturnType() { try { setUpMock(C.class, MockWithDifferentButAssignableReturnType.class); fail(); } catch (IllegalArgumentException e) { // passed } } public static class MockWithDifferentButAssignableReturnType { @Mock public final java.sql.Date createOtherObject(boolean b, Date d, int a) { return new java.sql.Date(d.getTime()); } } }