/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.mockups;
import java.lang.reflect.*;
import javax.annotation.*;
import mockit.internal.*;
import mockit.internal.state.*;
import static mockit.internal.util.Utilities.*;
/**
* An invocation to a {@code @Mock} method.
*/
public final class MockInvocation extends BaseInvocation
{
@Nonnull private final MockState mockState;
@Nonnull private final String mockedClassDesc;
@Nonnull private final String mockedMethodName;
@Nonnull private final String mockedMethodDesc;
boolean proceeding;
@Nonnull
public static MockInvocation create(
@Nullable Object invokedInstance, @Nullable Object[] invokedArguments,
@Nonnull String mockClassDesc, int mockStateIndex,
@Nonnull String mockedClassDesc, @Nonnull String mockedMethodName, @Nonnull String mockedMethodDesc)
{
Object mockUp = TestRun.getMock(mockClassDesc, invokedInstance);
assert mockUp != null;
MockState mockState = TestRun.getMockStates().getMockState(mockUp, mockStateIndex);
Object[] args = invokedArguments == null ? NO_ARGS : invokedArguments;
return new MockInvocation(invokedInstance, args, mockState, mockedClassDesc, mockedMethodName, mockedMethodDesc);
}
MockInvocation(
@Nullable Object invokedInstance, @Nonnull Object[] invokedArguments, @Nonnull MockState mockState,
@Nonnull String mockedClassDesc, @Nonnull String mockedMethodName, @Nonnull String mockedMethodDesc)
{
super(invokedInstance, invokedArguments, mockState.getTimesInvoked());
this.mockState = mockState;
this.mockedClassDesc = mockedClassDesc;
this.mockedMethodName = mockedMethodName;
this.mockedMethodDesc = mockedMethodDesc;
}
@Nonnull @Override
protected Member findRealMember()
{
Object invokedInstance = getInvokedInstance();
if (invokedInstance != null) {
Class<?> mockedClass = invokedInstance.getClass();
return mockState.getRealMethodOrConstructor(mockedClass, mockedMethodName, mockedMethodDesc);
}
return mockState.getRealMethodOrConstructor(mockedClassDesc, mockedMethodName, mockedMethodDesc);
}
public boolean shouldProceedIntoConstructor()
{
if (proceeding && getInvokedMember() instanceof Constructor) {
mockState.clearProceedIndicator();
return true;
}
return false;
}
@Override
public void prepareToProceed()
{
mockState.prepareToProceed(this);
proceeding = true;
}
public void prepareToProceedFromNonRecursiveMock()
{
mockState.prepareToProceedFromNonRecursiveMock(this);
proceeding = true;
}
@Override
public void cleanUpAfterProceed()
{
mockState.clearProceedIndicator();
}
}