package de.bechte.junit.runners.context.processing;
import de.bechte.junit.runners.context.description.MethodDescriber;
import de.bechte.junit.runners.context.statements.StatementExecutor;
import de.bechte.junit.runners.context.statements.builder.MethodStatementBuilder;
import de.bechte.junit.runners.model.TestClassPool;
import de.bechte.junit.stubs.ContextTestClassStub;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.internal.runners.statements.Fail;
import org.junit.runner.Description;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.junit.runners.model.TestClass;
import org.mockito.Mock;
import java.util.Arrays;
import java.util.List;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.isA;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
public class MethodExecutorTest {
@Mock
private MethodDescriber methodDescriber;
@Mock
private Description description;
@Mock
private StatementExecutor statementExecutor;
@Mock
private MethodStatementBuilder methodStatementBuilder1;
@Mock
private MethodStatementBuilder methodStatementBuilder2;
@Mock
private Statement statement1;
@Mock
private Statement statement2;
@Mock
private FrameworkMethod method;
@Mock
private Ignore ignoreAnnotation;
@Mock
private RunNotifier notifier;
private TestClass testClass;
private List<MethodStatementBuilder> statementBuilders;
private MethodExecutor methodExecutor;
@Before
public void setUp() throws Exception {
initMocks(this);
testClass = TestClassPool.forClass(ContextTestClassStub.class);
statementBuilders = Arrays.asList(methodStatementBuilder1, methodStatementBuilder2);
methodExecutor = new MethodExecutor(methodDescriber, statementExecutor, statementBuilders);
when(methodDescriber.describe(method)).thenReturn(description);
when(ignoreAnnotation.value()).thenReturn("ignore");
when(methodStatementBuilder1.createStatement(same(testClass), same(method), anyObject(), any(Statement.class), same(description), same(notifier))).thenReturn(statement1);
when(methodStatementBuilder2.createStatement(same(testClass), same(method), anyObject(), same(statement1), same(description), same(notifier))).thenReturn(statement2);
}
@Test
public void whenCalledForMethodWithIgnoreAnnotation_testIsIgnored() throws Exception {
when(method.getAnnotation(Ignore.class)).thenReturn(ignoreAnnotation);
methodExecutor.run(testClass, method, notifier);
verifyNoMoreInteractions(statementExecutor);
verify(notifier).fireTestIgnored(description);
verifyNoMoreInteractions(notifier);
}
@Test
public void whenCalledForMethod_statementExecutorIsExecutedWithAStatement() throws Exception {
methodExecutor.run(testClass, method, notifier);
verify(statementExecutor).execute(any(Statement.class), same(notifier), same(description));
verifyNoMoreInteractions(statementExecutor);
verifyNoMoreInteractions(notifier);
}
@Test
public void whenCalledForMethod_statementBuildersAreExecuted() throws Exception {
methodExecutor.run(testClass, method, notifier);
verify(methodStatementBuilder1).createStatement(same(testClass), same(method), any(Object.class), any(Statement.class), same(description), same(notifier));
verify(methodStatementBuilder2).createStatement(same(testClass), same(method), any(Object.class), same(statement1), same(description), same(notifier));
verify(statementExecutor).execute(same(statement2), same(notifier), same(description));
verifyNoMoreInteractions(methodStatementBuilder1);
verifyNoMoreInteractions(methodStatementBuilder2);
verifyNoMoreInteractions(notifier);
}
@Test
public void whenStatementExecutorThrowsException_failureIsReportedAtTheNotifier() throws Exception {
doThrow(new RuntimeException("")).when(statementExecutor).execute(statement2, notifier, description);
methodExecutor.run(testClass, method, notifier);
verify(statementExecutor).execute(isA(Fail.class), same(notifier), same(description));
verifyNoMoreInteractions(notifier);
}
}