/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import java.beans.*;
import java.util.*;
import static org.junit.Assert.*;
import org.junit.*;
public final class ExpectationsUsingMockedTest
{
public interface Dependency { String doSomething(boolean b); }
static class Collaborator
{
private int value;
Collaborator() {}
Collaborator(int value) { this.value = value; }
int getValue() { return value; }
@SuppressWarnings("UnusedDeclaration")
final void simpleOperation(int a, String b, Date c) {}
}
public abstract static class AbstractBase {
protected abstract boolean add(Integer i);
final int doSomething() { return -1; }
}
@Mocked AbstractBase base;
@Test
public void multipleMockParametersOfSameMockedType(
@Mocked final Dependency dependency1, @Mocked final Dependency dependency2)
{
new Expectations() {{
dependency1.doSomething(true); result = "1";
dependency2.doSomething(false); result = "2";
}};
assertEquals("1", dependency1.doSomething(true));
assertNull(dependency1.doSomething(false));
assertEquals("2", dependency2.doSomething(false));
assertNull(dependency2.doSomething(true));
}
@Test
public void mockFieldForAbstractClass()
{
new Expectations() {{
base.add(1); result = true;
}};
assertFalse(base.add(0));
assertTrue(base.add(1));
assertFalse(base.add(2));
}
static class ClassWithStaticInitializer
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void stubOutStaticInitializersWhenSpecified(
@Mocked(stubOutClassInitialization = true) ClassWithStaticInitializer unused)
{
assertEquals(0, ClassWithStaticInitializer.initialized());
assertFalse(ClassWithStaticInitializer.initialized);
}
static class ClassWithStaticInitializer2
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void doNotStubOutStaticInitializersByDefault(@Mocked ClassWithStaticInitializer2 unused)
{
assertEquals(0, ClassWithStaticInitializer2.initialized());
assertTrue(ClassWithStaticInitializer2.initialized);
}
static class AnotherClassWithStaticInitializer
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void mockEverythingWithoutStubbingStaticInitializers(@Mocked AnotherClassWithStaticInitializer unused)
{
assertEquals(0, AnotherClassWithStaticInitializer.initialized());
assertTrue(AnotherClassWithStaticInitializer.initialized);
}
static class AnotherClassWithStaticInitializer2
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test @SuppressWarnings("DefaultAnnotationParam")
public void avoidStubbingStaticInitializersThroughSpecificAnnotationAttribute(
@Mocked(stubOutClassInitialization = false) AnotherClassWithStaticInitializer2 unused)
{
assertEquals(0, AnotherClassWithStaticInitializer2.initialized());
assertTrue(AnotherClassWithStaticInitializer2.initialized);
}
class InnerClass { int getValue() { return -1; } }
@Test
public void mockInnerClass(@Mocked final InnerClass innerMock)
{
assertEquals(0, innerMock.getValue());
new Expectations() {{
innerMock.getValue(); result = 123; times = 1;
}};
assertEquals(123, new InnerClass().getValue());
}
static final class SubClass extends AbstractBase { @Override protected boolean add(Integer i) { return false; } }
@Test
public void recordMethodFromAbstractBaseClassAndReplayOnSubclass()
{
new Expectations() {{ base.doSomething(); result = 1; }};
int i = new SubClass().doSomething();
assertEquals(1, i);
}
public interface BusinessInterface {}
@Test
public void getBeanInfoFromMockedInterface(@Mocked BusinessInterface mock) throws Exception
{
Class<? extends BusinessInterface> mockClass = mock.getClass();
BeanInfo info = Introspector.getBeanInfo(mockClass);
assertNotNull(info);
}
static class GenericBase<B extends Runnable> { public B base() { return null; } }
public static final class GenericSubclass<S extends Runnable> extends GenericBase<S> { /* bridge method here */ }
@Test
public void recordExpectationOnBaseMethodHavingASyntheticBridgeMethodInSubclass(@Mocked final GenericSubclass mock)
{
new Expectations() {{
mock.base();
result = null;
}};
assertNull(mock.base());
}
}