/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import static org.junit.Assert.*;
import org.junit.*;
import mockit.internal.state.*;
public final class MockitTest
{
private Class<?> classRedefined;
static class RealClass
{
int doSomething() { return 1; }
}
@Test
public void redefineMethodsWithEmptyMockClass()
{
Mockit.setUpMock(RealClass.class, EmptyMockClass.class);
assertEquals(0, TestRun.mockFixture().getRedefinedClassCount());
assertEquals(0, TestRun.getMockClasses().getRegularMocks().getInstanceCount());
assertEquals(1, new RealClass().doSomething());
assertEquals(2, new EmptyMockClass().utilityMethod());
}
public static class EmptyMockClass
{
int utilityMethod() { return 2; }
}
@Test
public void redefineMethodsWithMockClass()
{
classRedefined = RealClass.class;
Mockit.setUpMock(RealClass.class, MockClass.class);
assertClassRedefined();
assertEquals(0, TestRun.getMockClasses().getRegularMocks().getInstanceCount());
}
public static class MockClass
{
@Mock
public int doSomething() { return -1; }
}
private void assertClassRedefined()
{
assertEquals(1, TestRun.mockFixture().getRedefinedClassCount());
assertTrue(TestRun.mockFixture().containsRedefinedClass(classRedefined));
}
@Test
public void redefineMethodsWithMockInstance()
{
classRedefined = RealClass.class;
MockClass mockInstance = new MockClass();
Mockit.setUpMock(RealClass.class, mockInstance);
assertClassRedefined();
assertEquals(1, TestRun.getMockClasses().getRegularMocks().getInstanceCount());
assertTrue(TestRun.getMockClasses().getRegularMocks().containsInstance(mockInstance));
}
@Test(expected = IllegalArgumentException.class)
public void redefineMethodsWithMockMethodForNoCorrespondingRealMethod()
{
Mockit.setUpMock(RealClass.class, MockClassWithMethodWithoutRealMethod.class);
}
public static class MockClassWithMethodWithoutRealMethod
{
@Mock
public void doSomethingElse() {}
}
@Test(expected = IllegalArgumentException.class)
public void redefineMethodsWithIncompatibleReturnTypeBetweenRealAndMockMethod()
{
Mockit.setUpMock(RealClass2.class, MockClassWithIncompatibleReturnType.class);
// Force the compiler to generate a synthetic "String access$0(RealClass2)" method:
new RealClass2().dummy();
}
@SuppressWarnings({"InnerClassMayBeStatic"})
class RealClass2
{
@SuppressWarnings({"UnusedDeclaration"})
private String dummy() { return null; }
}
public static class MockClassWithIncompatibleReturnType
{
@Mock
public int dummy() { return 0; }
}
@Test
public void restoreOriginalDefinition()
{
Mockit.setUpMock(RealClass.class, MockClass.class);
Mockit.tearDownMocks(RealClass.class);
assertEquals(0, TestRun.mockFixture().getRedefinedClassCount());
}
@Test
public void restoreOriginalDefinitionWithClassNotRedefined()
{
Mockit.tearDownMocks(RealClass.class);
assertEquals(0, TestRun.mockFixture().getRedefinedClassCount());
}
@Test
public void restoreAllDefinitions()
{
Mockit.setUpMock(RealClass.class, new MockClass());
Mockit.tearDownMocks();
assertEquals(0, TestRun.mockFixture().getRedefinedClassCount());
assertEquals(0, TestRun.getMockClasses().getRegularMocks().getInstanceCount());
}
public interface SomeInterface
{
int method1();
long method2(int i);
boolean method3(String s, boolean b);
String method4();
double method5();
float method6();
char method7();
byte method8();
short method9();
int doSomething();
}
@Test
public void createClassWithNewEmptyProxy()
{
SomeInterface proxy = Mockit.newEmptyProxy(SomeInterface.class);
assertNotNull(proxy);
assertEquals(0, proxy.method1());
assertEquals(0L, proxy.method2(4));
assertFalse(proxy.method3(null, true));
assertNull(proxy.method4());
assertEquals(0.0, proxy.method5(), 0.0);
assertEquals(0.0F, proxy.method6(), 0.0);
assertEquals('\0', proxy.method7());
assertEquals((byte) 0, proxy.method8());
assertEquals((short) 0, proxy.method9());
}
@Test
public void createEmptyProxyForJREInterface()
{
Runnable proxy = Mockit.newEmptyProxy(null, Runnable.class);
proxy.run();
}
@Test
public void redefineMethodsInProxyClass()
{
SomeInterface proxy = Mockit.newEmptyProxy(SomeInterface.class);
classRedefined = proxy.getClass();
Mockit.setUpMock(classRedefined, MockClass.class);
assertClassRedefined();
}
@Test
public void callEqualsMethodOnEmptyProxy()
{
SomeInterface proxy1 = Mockit.newEmptyProxy(SomeInterface.class);
SomeInterface proxy2 = Mockit.newEmptyProxy(SomeInterface.class);
//noinspection SimplifiableJUnitAssertion
assertTrue(proxy1.equals(proxy1));
assertFalse(proxy1.equals(proxy2));
assertFalse(proxy2.equals(proxy1));
//noinspection ObjectEqualsNull
assertFalse(proxy1.equals(null));
}
@Test
public void callHashCodeMethodOnEmptyProxy()
{
SomeInterface proxy = Mockit.newEmptyProxy(SomeInterface.class);
assertEquals(System.identityHashCode(proxy), proxy.hashCode());
}
@Test
public void callToStringMethodOnEmptyProxy()
{
SomeInterface proxy = Mockit.newEmptyProxy(SomeInterface.class);
assertEquals(proxy.getClass().getName() + '@' + Integer.toHexString(proxy.hashCode()), proxy.toString());
}
@Test
public void mockJREMethodAndConstructor() throws Exception
{
Mockit.setUpMock(LoginContext.class, new MockLoginContext());
new LoginContext("test", (CallbackHandler) null).login();
}
public static class MockLoginContext
{
@Mock
public void $init(String name, CallbackHandler callbackHandler)
{
assertEquals("test", name);
assertNull(callbackHandler);
}
@Mock
public void login() {}
}
}