/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit;
import static org.junit.Assert.*;
import org.junit.*;
import org.junit.rules.*;
public final class MockInvocationTest
{
@Rule public final ExpectedException thrown = ExpectedException.none();
public static class Collaborator
{
int value;
Collaborator() {}
public Collaborator(int i) { value = i; }
public int getValue() { return -1; }
public void setValue(int i) { value = i; }
public String doSomething(boolean b, int[] i, String s) { return s + b + i[0]; }
public static boolean staticMethod() { return true; }
}
static final class MockMethods extends MockUp<Collaborator>
{
@Mock
static boolean staticMethod(Invocation context)
{
assertNotNull(context);
assertNull(context.getInvokedInstance());
assertEquals(1, context.getInvocationCount());
return false;
}
@Mock
int getValue(Invocation context)
{
assertTrue(context.getInvokedInstance() instanceof Collaborator);
assertEquals(0, context.getInvocationIndex());
return 123;
}
}
@Test
public void mockMethodsForMethodsWithoutParameters()
{
new MockMethods();
assertFalse(Collaborator.staticMethod());
assertEquals(123, new Collaborator().getValue());
}
@Test
public void instanceMockMethodForStaticMethod()
{
new MockUp<Collaborator>() {
@Mock
boolean staticMethod(Invocation context)
{
assertNull(context.getInvokedInstance());
assertEquals(context.getInvocationCount() - 1, context.getInvocationIndex());
return context.getInvocationCount() <= 0;
}
};
assertFalse(Collaborator.staticMethod());
assertFalse(Collaborator.staticMethod());
}
@Test
public void mockMethodsWithInvocationParameter()
{
new MockUp<Collaborator>() {
Collaborator instantiated;
@Mock
void $init(Invocation inv, int i)
{
assertNotNull(inv.getInvokedInstance());
assertTrue(i > 0);
instantiated = inv.getInvokedInstance();
}
@Mock
String doSomething(Invocation inv, boolean b, int[] array, String s)
{
assertNotNull(inv);
assertSame(instantiated, inv.getInvokedInstance());
assertEquals(1, inv.getInvocationCount());
assertTrue(b);
assertNull(array);
assertEquals("test", s);
return "mock";
}
};
String s = new Collaborator(123).doSomething(true, null, "test");
assertEquals("mock", s);
}
static class MockMethodsWithParameters extends MockUp<Collaborator>
{
int capturedArgument;
Collaborator mockedInstance;
@Mock
void $init(Invocation context, int i)
{
capturedArgument = i + context.getInvocationCount();
assertNull(mockedInstance);
assertTrue(context.getInvokedInstance() instanceof Collaborator);
assertEquals(1, context.getInvokedArguments().length);
}
@Mock
void setValue(Invocation context, int i)
{
assertEquals(i, context.getInvocationIndex());
assertSame(mockedInstance, context.getInvokedInstance());
assertEquals(1, context.getInvokedArguments().length);
}
}
@Test
public void mockMethodsWithParameters()
{
MockMethodsWithParameters mock = new MockMethodsWithParameters();
Collaborator col = new Collaborator(4);
mock.mockedInstance = col;
assertEquals(5, mock.capturedArgument);
col.setValue(0);
col.setValue(1);
}
@Test
public void useOfContextParametersForJREMethods() throws Exception
{
new MockUp<Runtime>() {
@Mock
void runFinalizersOnExit(Invocation inv, boolean b)
{
assertNull(inv.getInvokedInstance());
assertEquals(1, inv.getInvocationCount());
assertTrue(b);
}
@Mock
Process exec(Invocation inv, String command, String[] envp)
{
assertSame(Runtime.getRuntime(), inv.getInvokedInstance());
assertEquals(0, inv.getInvocationIndex());
assertNotNull(command);
assertNull(envp);
return null;
}
};
//noinspection deprecation
Runtime.runFinalizersOnExit(true);
assertNull(Runtime.getRuntime().exec("test", null));
}
}