Home | History | Annotate | Download | only in invocation
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 
      6 package org.mockito.internal.invocation;
      7 
      8 import org.assertj.core.api.Assertions;
      9 import org.junit.Before;
     10 import org.junit.Test;
     11 import org.mockito.Mock;
     12 import org.mockito.internal.verification.InOrderContextImpl;
     13 import org.mockito.internal.verification.api.InOrderContext;
     14 import org.mockito.invocation.Invocation;
     15 import org.mockito.invocation.Location;
     16 import org.mockitousage.IMethods;
     17 import org.mockitoutil.TestBase;
     18 
     19 import java.util.Arrays;
     20 import java.util.Collections;
     21 import java.util.LinkedList;
     22 import java.util.List;
     23 
     24 import static junit.framework.TestCase.assertNull;
     25 import static junit.framework.TestCase.assertSame;
     26 import static junit.framework.TestCase.assertTrue;
     27 
     28 
     29 public class InvocationsFinderTest extends TestBase {
     30 
     31     private LinkedList<Invocation> invocations = new LinkedList<Invocation>();
     32     private Invocation simpleMethodInvocation;
     33     private Invocation simpleMethodInvocationTwo;
     34     private Invocation differentMethodInvocation;
     35 
     36 
     37     private final InOrderContext context = new InOrderContextImpl();
     38 
     39     @Mock private IMethods mock;
     40 
     41     @Before
     42     public void setup() throws Exception {
     43         simpleMethodInvocation = new InvocationBuilder().mock(mock).simpleMethod().seq(1).toInvocation();
     44         simpleMethodInvocationTwo = new InvocationBuilder().mock(mock).simpleMethod().seq(2).toInvocation();
     45         differentMethodInvocation = new InvocationBuilder().mock(mock).differentMethod().seq(3).toInvocation();
     46         invocations.addAll(Arrays.asList(simpleMethodInvocation, simpleMethodInvocationTwo, differentMethodInvocation));
     47 
     48     }
     49 
     50     @Test
     51     public void shouldFindActualInvocations() throws Exception {
     52         List<Invocation> actual = InvocationsFinder.findInvocations(invocations, new InvocationMatcher(simpleMethodInvocation));
     53         Assertions.assertThat(actual).containsSequence(simpleMethodInvocation, simpleMethodInvocationTwo);
     54 
     55         actual = InvocationsFinder.findInvocations(invocations, new InvocationMatcher(differentMethodInvocation));
     56         Assertions.assertThat(actual).containsSequence(differentMethodInvocation);
     57     }
     58 
     59     @Test
     60     public void shouldFindFirstUnverifiedInvocation() throws Exception {
     61         assertSame(simpleMethodInvocation, InvocationsFinder.findFirstUnverified(invocations));
     62 
     63         simpleMethodInvocationTwo.markVerified();
     64         simpleMethodInvocation.markVerified();
     65 
     66         assertSame(differentMethodInvocation, InvocationsFinder.findFirstUnverified(invocations));
     67 
     68         differentMethodInvocation.markVerified();
     69         assertNull(InvocationsFinder.findFirstUnverified(invocations));
     70     }
     71 
     72     @Test
     73     public void shouldFindFirstUnverifiedInOrder() throws Exception {
     74         //given
     75         InOrderContextImpl context = new InOrderContextImpl();
     76         assertSame(simpleMethodInvocation, InvocationsFinder.findFirstUnverifiedInOrder(context, invocations));
     77 
     78         //when
     79         context.markVerified(simpleMethodInvocationTwo);
     80         context.markVerified(simpleMethodInvocation);
     81 
     82         //then
     83         assertSame(differentMethodInvocation, InvocationsFinder.findFirstUnverifiedInOrder(context, invocations));
     84 
     85         //when
     86         context.markVerified(differentMethodInvocation);
     87 
     88         //then
     89         assertNull(InvocationsFinder.findFirstUnverifiedInOrder(context, invocations));
     90     }
     91 
     92     @Test
     93     public void shouldFindFirstUnverifiedInOrderAndRespectSequenceNumber() throws Exception {
     94         //given
     95         InOrderContextImpl context = new InOrderContextImpl();
     96         assertSame(simpleMethodInvocation, InvocationsFinder.findFirstUnverifiedInOrder(context, invocations));
     97 
     98         //when
     99         //skipping verification of first invocation, then:
    100         context.markVerified(simpleMethodInvocationTwo);
    101         context.markVerified(differentMethodInvocation);
    102 
    103         //then
    104         assertSame(null, InvocationsFinder.findFirstUnverifiedInOrder(context, invocations));
    105     }
    106 
    107     @Test
    108     public void shouldFindFirstUnverifiedInvocationOnMock() throws Exception {
    109         assertSame(simpleMethodInvocation, InvocationsFinder.findFirstUnverified(invocations, simpleMethodInvocation.getMock()));
    110         assertNull(InvocationsFinder.findFirstUnverified(invocations, "different mock"));
    111     }
    112 
    113     @Test
    114     public void shouldFindFirstSimilarInvocationByName() throws Exception {
    115         Invocation overloadedSimpleMethod = new InvocationBuilder().mock(mock).simpleMethod().arg("test").toInvocation();
    116 
    117         Invocation found = InvocationsFinder.findSimilarInvocation(invocations, new InvocationMatcher(overloadedSimpleMethod));
    118         assertSame(found, simpleMethodInvocation);
    119     }
    120 
    121     @Test
    122     public void shouldFindInvocationWithTheSameMethod() throws Exception {
    123         Invocation overloadedDifferentMethod = new InvocationBuilder().differentMethod().arg("test").toInvocation();
    124 
    125         invocations.add(overloadedDifferentMethod);
    126 
    127         Invocation found = InvocationsFinder.findSimilarInvocation(invocations, new InvocationMatcher(overloadedDifferentMethod));
    128         assertSame(found, overloadedDifferentMethod);
    129     }
    130 
    131     @Test
    132     public void shouldGetLastStackTrace() throws Exception {
    133         Location last = InvocationsFinder.getLastLocation(invocations);
    134         assertSame(differentMethodInvocation.getLocation(), last);
    135 
    136         assertNull(InvocationsFinder.getLastLocation(Collections.<Invocation>emptyList()));
    137     }
    138 
    139     @Test
    140     public void shouldFindAllMatchingUnverifiedChunks() throws Exception {
    141         List<Invocation> allMatching = InvocationsFinder.findAllMatchingUnverifiedChunks(invocations, new InvocationMatcher(simpleMethodInvocation), context);
    142         Assertions.assertThat(allMatching).containsSequence(simpleMethodInvocation, simpleMethodInvocationTwo);
    143 
    144         context.markVerified(simpleMethodInvocation);
    145         allMatching = InvocationsFinder.findAllMatchingUnverifiedChunks(invocations, new InvocationMatcher(simpleMethodInvocation), context);
    146         Assertions.assertThat(allMatching).containsSequence(simpleMethodInvocationTwo);
    147 
    148         context.markVerified(simpleMethodInvocationTwo);
    149         allMatching = InvocationsFinder.findAllMatchingUnverifiedChunks(invocations, new InvocationMatcher(simpleMethodInvocation), context);
    150         assertTrue(allMatching.isEmpty());
    151     }
    152 
    153     @Test
    154     public void shouldFindMatchingChunk() throws Exception {
    155         List<Invocation> chunk = InvocationsFinder.findMatchingChunk(invocations, new InvocationMatcher(simpleMethodInvocation), 2, context);
    156         Assertions.assertThat(chunk).containsSequence(simpleMethodInvocation, simpleMethodInvocationTwo);
    157     }
    158 
    159     @Test
    160     public void shouldReturnAllChunksWhenModeIsAtLeastOnce() throws Exception {
    161         Invocation simpleMethodInvocationThree = new InvocationBuilder().mock(mock).toInvocation();
    162         invocations.add(simpleMethodInvocationThree);
    163 
    164         List<Invocation> chunk = InvocationsFinder.findMatchingChunk(invocations, new InvocationMatcher(simpleMethodInvocation), 1, context);
    165         Assertions.assertThat(chunk).containsSequence(simpleMethodInvocation, simpleMethodInvocationTwo, simpleMethodInvocationThree);
    166     }
    167 
    168     @Test
    169     public void shouldReturnAllChunksWhenWantedCountDoesntMatch() throws Exception {
    170         Invocation simpleMethodInvocationThree = new InvocationBuilder().mock(mock).toInvocation();
    171         invocations.add(simpleMethodInvocationThree);
    172 
    173         List<Invocation> chunk = InvocationsFinder.findMatchingChunk(invocations, new InvocationMatcher(simpleMethodInvocation), 1, context);
    174         Assertions.assertThat(chunk).containsSequence(simpleMethodInvocation, simpleMethodInvocationTwo, simpleMethodInvocationThree);
    175     }
    176 
    177     @Test
    178     public void shouldFindPreviousInOrder() throws Exception {
    179         Invocation previous = InvocationsFinder.findPreviousVerifiedInOrder(invocations, context);
    180         assertNull(previous);
    181 
    182         context.markVerified(simpleMethodInvocation);
    183         context.markVerified(simpleMethodInvocationTwo);
    184 
    185         previous = InvocationsFinder.findPreviousVerifiedInOrder(invocations, context);
    186         assertSame(simpleMethodInvocationTwo, previous);
    187     }
    188 }
    189