/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import java.util.*;
import javax.swing.*;
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; }
void provideSomeService() {}
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);
}
@NonStrict AbstractBase base;
static final class DependencyImpl implements Dependency
{
public String doSomething(boolean b) { return ""; }
}
@Mocked("do.*") DependencyImpl mockDependency;
@Test
public void annotatedField()
{
//noinspection UnusedDeclaration
new Expectations()
{
@Mocked
private Collaborator mock;
{
new Collaborator().getValue();
}
};
new Collaborator().getValue();
}
@Test
public void annotatedMockFieldWithFilters()
{
new Expectations()
{
@Mocked({"(int)", "doInternal()", "[gs]etValue", "complexOperation(Object)"})
Collaborator mock;
{
mock.getValue();
}
};
// Calls the real method, not a mock.
Collaborator collaborator = new Collaborator();
collaborator.provideSomeService();
// Calls the mock method.
collaborator.getValue();
}
@Test
public void annotatedMockFieldWithInverseFilters()
{
new Expectations()
{
@Mocked(
inverse = true,
methods = {"(int)", "simpleOperation(int, String, java.util.Date)", "setValue(long)"})
Collaborator mock;
{
mock.provideSomeService();
}
};
Collaborator collaborator = new Collaborator(2);
collaborator.simpleOperation(1, "", null); // calls real method
collaborator.provideSomeService(); // calls the mock
}
@Test(expected = IllegalArgumentException.class)
public void annotatedFieldWithInvalidFilter()
{
new Expectations()
{
@Mocked("setValue(int")
Collaborator mock;
};
}
@Test
public void annotatedParameter(@Mocked final List<Integer> mock)
{
new Expectations()
{
{
mock.get(1);
}
};
assertNull(mock.get(1));
}
@Test
public void annotatedFieldAndParameter(@NonStrict final Dependency dependency1)
{
//noinspection UnusedDeclaration
new Expectations()
{
@NonStrict private Dependency dependency2;
{
dependency1.doSomething(true); result = "1";
dependency2.doSomething(false); result = "2";
}
};
assertEquals("1", dependency1.doSomething(true));
assertNull(dependency1.doSomething(false));
}
@Test
public void mockFinalFieldOfInterfaceTypeWithSpecifiedRealClassName()
{
new NonStrictExpectations()
{
@Mocked(realClassName = "mockit.ExpectationsUsingMockedTest$DependencyImpl")
final Dependency mock = new DependencyImpl();
{
mock.doSomething(false);
}
};
}
@Test(expected = IllegalArgumentException.class)
public void mockFinalFieldOfInterfaceTypeWithoutRealClassName()
{
new NonStrictExpectations()
{
final Dependency mock = null;
};
}
@Test
public void mockFieldForAbstractClass()
{
new Expectations()
{
{
base.add(1); result = true;
}
};
assertFalse(base.add(0));
assertTrue(base.add(1));
assertFalse(base.add(2));
}
@Test
public void partialMockingOfConcreteClassThatExcludesConstructors()
{
new Expectations()
{
{
mockDependency.doSomething(anyBoolean); minTimes = 2;
}
};
mockDependency.doSomething(true);
mockDependency.doSomething(false);
mockDependency.doSomething(true);
}
@Test
public void mockNothingAndStubNoStaticInitializers(@Mocked("") JComponent container)
{
assertEquals("Test", new JLabel("Test").getText());
}
static class ClassWithStaticInitializer
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void onlyStubOutStaticInitializers()
{
new Expectations()
{
@Mocked("<clinit>") final ClassWithStaticInitializer unused = null;
};
assertEquals(-1, ClassWithStaticInitializer.initialized());
}
static class ClassWithStaticInitializer2
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void stubOutStaticInitializersWhenSpecified(
@Mocked(stubOutClassInitialization = true) ClassWithStaticInitializer2 unused)
{
assertEquals(0, ClassWithStaticInitializer2.initialized());
assertFalse(ClassWithStaticInitializer2.initialized);
}
static class ClassWithStaticInitializer3
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void doNotStubOutStaticInitializersByDefault(@Mocked ClassWithStaticInitializer3 unused)
{
assertEquals(0, ClassWithStaticInitializer3.initialized());
assertTrue(ClassWithStaticInitializer3.initialized);
}
static class AnotherClassWithStaticInitializer
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
public void mockEverythingWithoutStubbingStaticInitializers()
{
new Expectations()
{
@Mocked(methods = "<clinit>", inverse = true, stubOutClassInitialization = true)
final AnotherClassWithStaticInitializer unused = null;
};
assertEquals(0, AnotherClassWithStaticInitializer.initialized());
assertTrue(AnotherClassWithStaticInitializer.initialized);
}
static class AnotherClassWithStaticInitializer2
{
static boolean initialized = true;
static int initialized() { return initialized ? 1 : -1; }
}
@Test
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(final InnerClass innerMock)
{
assert innerMock.getValue() == 0;
new NonStrictExpectations()
{
{
innerMock.getValue(); result = 123; times = 1;
}
};
assert new InnerClass().getValue() == 123;
}
static final class ClassWithNative
{
int doSomething() { return nativeMethod(); }
private native int nativeMethod();
}
@Test
public void partiallyMockNativeMethod(@Mocked("nativeMethod") final ClassWithNative mock)
{
new Expectations()
{
{
mock.nativeMethod(); result = 123;
}
};
assertEquals(123, mock.doSomething());
}
}