/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import java.util.concurrent.*;
import static org.junit.Assert.*;
import org.junit.*;
import mockit.internal.*;
@SuppressWarnings("UnusedDeclaration")
public final class RestrictedFullVerificationsTest
{
static class Dependency
{
public void setSomething(int value) {}
public int editABunchMoreStuff() { return 0; }
public boolean prepare() { return false; }
public void save() {}
static void staticMethod(String s) {}
}
static final class SubDependency extends Dependency
{
int getValue() { return 5; }
}
static final class AnotherDependency
{
void doSomething() {}
String doSomethingElse(int i) { return String.valueOf(i); }
static boolean staticMethod() { return true; }
}
@Mocked Dependency mock;
void exerciseCodeUnderTest()
{
mock.prepare();
mock.setSomething(123);
mock.editABunchMoreStuff();
mock.save();
}
@Test
public void verifyAllInvocationsToOnlyOneOfTwoMockedTypes(@Mocked AnotherDependency mock2)
{
exerciseCodeUnderTest();
mock2.doSomething();
new FullVerifications(mock) {{
mock.prepare();
mock.setSomething(anyInt); minTimes = 1; maxTimes = 2;
mock.editABunchMoreStuff();
mock.save(); times = 1;
}};
new FullVerifications(mock.getClass()) {{
mock.prepare();
mock.setSomething(anyInt); minTimes = 1; maxTimes = 2;
mock.editABunchMoreStuff();
mock.save(); times = 1;
}};
}
@Test(expected = UnexpectedInvocation.class)
public void verifyAllInvocationsWithSomeMissing(@Mocked final AnotherDependency mock2)
{
exerciseCodeUnderTest();
mock2.doSomething();
new FullVerifications(mock, mock2) {{
mock.prepare();
mock.setSomething(anyInt);
mock.save();
mock2.doSomething();
}};
}
@Test
public void verifyOnlyInvocationsToGenericType(@Mocked final Callable<Dependency> mock2) throws Exception
{
exerciseCodeUnderTest();
mock2.call();
new FullVerificationsInOrder(mock2) {{ mock2.call(); }};
}
@Test
public void verifyAllInvocationsToInheritedMethods(@Mocked SubDependency mock2)
{
mock.prepare();
mock2.getValue();
new FullVerificationsInOrder(mock) {{ mock.prepare(); }};
new FullVerificationsInOrder(Dependency.class) {{ mock.prepare(); }};
}
@Test(expected = UnexpectedInvocation.class)
public void verifyAllInvocationsToInheritedMethods_whenNotVerified(@Mocked final SubDependency mock2)
{
mock2.prepare();
mock2.getValue();
new FullVerifications(mock2) {{ mock2.getValue(); }};
}
@Test
public void verifyAllInvocationsToSubclassMethods(@Mocked final SubDependency mock2)
{
mock.prepare();
mock2.getValue();
new FullVerifications(mock2.getClass()) {{ mock2.getValue(); }};
}
@Test(expected = UnexpectedInvocation.class)
public void verifyAllInvocationsToSubclassMethods_whenNotVerified(@Mocked SubDependency mock2)
{
mock.prepare();
mock2.getValue();
new FullVerificationsInOrder(mock2.getClass()) {{ mock.prepare(); }};
}
@Test
public void verifyAllInvocationsToMethodsOfBaseClassAndOfSubclass(@Mocked final SubDependency mock2)
{
mock2.prepare();
mock2.getValue();
new FullVerifications(mock2) {{
mock2.prepare();
mock2.getValue();
}};
}
@Test(expected = UnexpectedInvocation.class)
public void verifyAllInvocationsToMethodsOfBaseClassAndOfSubclass_whenInheritedMethodNotVerified(
@Mocked final SubDependency mock2)
{
mock2.prepare();
mock2.getValue();
new FullVerificationsInOrder(mock2) {{ mock2.getValue(); }};
}
@Test(expected = UnexpectedInvocation.class)
public void verifyAllInvocationsToMethodsOfBaseClassAndOfSubclass_whenSubclassMethodNotVerified(
@Mocked SubDependency mock2)
{
mock.prepare();
mock2.getValue();
new FullVerifications(mock2) {{ mock.prepare(); }};
}
@Test
public void verifyAllInvocationsWithReplayOnDifferentInstance()
{
new Dependency().save();
new FullVerificationsInOrder(mock) {{
new Dependency();
mock.save();
}};
}
@Test
public void verifyAllInvocationsWithReplayOnSameInstance(@Mocked final Dependency mock2)
{
mock2.editABunchMoreStuff();
new FullVerifications(mock2) {{ mock2.editABunchMoreStuff(); }};
}
@Test(expected = MissingInvocation.class)
public void verifyAllWithReplayOnDifferentInstanceWhenShouldBeSame(@Mocked Dependency mock2)
{
mock2.editABunchMoreStuff();
new FullVerificationsInOrder(mock2) {{
mock.editABunchMoreStuff();
}};
}
@Test(expected = UnexpectedInvocation.class)
public void verifyAllWithUnverifiedReplayOnSameInstance(@Mocked Dependency mock2)
{
mock.editABunchMoreStuff();
mock2.editABunchMoreStuff();
new FullVerifications(mock2) {{ mock.editABunchMoreStuff(); }};
}
@Test
public void verifyStaticInvocationForSpecifiedMockInstance(@Mocked final AnotherDependency mock2)
{
mock2.doSomething();
AnotherDependency.staticMethod();
mock2.doSomethingElse(1);
mock.editABunchMoreStuff();
mock2.doSomethingElse(2);
new FullVerificationsInOrder(mock2) {{
mock2.doSomething();
AnotherDependency.staticMethod();
mock2.doSomethingElse(anyInt);
mock2.doSomethingElse(anyInt);
}};
}
@Test(expected = UnexpectedInvocation.class)
public void unverifiedStaticInvocationForSpecifiedMockInstance(@Mocked final AnotherDependency mock2)
{
mock2.doSomething();
AnotherDependency.staticMethod();
new FullVerifications(mock2) {{ mock2.doSomething(); }};
}
@Test(expected = UnexpectedInvocation.class)
public void unverifiedStaticInvocationForSpecifiedSubclassInstance(@Mocked final SubDependency mock2)
{
mock2.getValue();
Dependency.staticMethod("test");
new FullVerificationsInOrder(mock2) {{ mock2.getValue(); }};
}
@Test
public void verifyNoInvocationsOccurredOnOneOfTwoMockedDependencies(@Mocked AnotherDependency mock2)
{
mock2.doSomething();
new FullVerifications(mock) {};
}
@Test
public void verifyNoInvocationsOccurredOnMockedDependencyWithOneHavingOccurred(@Mocked AnotherDependency mock2)
{
mock2.doSomething();
mock.editABunchMoreStuff();
try {
new FullVerifications(mock) {};
fail();
}
catch (UnexpectedInvocation e) {
assertTrue(e.getMessage().contains("editABunchMoreStuff()"));
}
}
@Test
public void verifyNoInvocationsOnOneOfTwoMockedDependenciesBeyondThoseRecordedAsExpected(
@Mocked final AnotherDependency mock2)
{
new Expectations() {{
mock.setSomething(anyInt);
mock2.doSomething(); times = 1;
}};
mock.prepare();
mock.setSomething(1);
mock.setSomething(2);
mock.save();
mock2.doSomething();
new FullVerifications(mock2) {};
}
}