Home | History | Annotate | Download | only in junitrule
      1 /*
      2  * Copyright (c) 2017 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 package org.mockitousage.junitrule;
      6 
      7 import org.junit.Rule;
      8 import org.junit.Test;
      9 import org.junit.runner.JUnitCore;
     10 import org.junit.runner.Result;
     11 import org.mockito.exceptions.base.MockitoAssertionError;
     12 import org.mockito.junit.MockitoJUnit;
     13 import org.mockito.junit.VerificationCollector;
     14 import org.mockitousage.IMethods;
     15 
     16 import static org.assertj.core.api.Assertions.assertThat;
     17 import static org.junit.Assert.fail;
     18 import static org.mockito.Mockito.*;
     19 
     20 public class VerificationCollectorImplTest {
     21 
     22     @Test
     23     public void should_not_throw_any_exceptions_when_verifications_are_successful() {
     24         VerificationCollector collector = MockitoJUnit.collector().assertLazily();
     25 
     26         IMethods methods = mock(IMethods.class);
     27         methods.simpleMethod();
     28 
     29         verify(methods).simpleMethod();
     30         collector.collectAndReport();
     31     }
     32 
     33     @Test(expected = MockitoAssertionError.class)
     34     public void should_collect_verification_failures() {
     35         VerificationCollector collector = MockitoJUnit.collector().assertLazily();
     36 
     37         IMethods methods = mock(IMethods.class);
     38 
     39         verify(methods).simpleMethod();
     40         collector.collectAndReport();
     41     }
     42 
     43     @Test
     44     public void should_collect_multiple_verification_failures() {
     45         VerificationCollector collector = MockitoJUnit.collector().assertLazily();
     46 
     47         IMethods methods = mock(IMethods.class);
     48 
     49         verify(methods).simpleMethod();
     50         verify(methods).byteReturningMethod();
     51         try {
     52             collector.collectAndReport();
     53             fail();
     54         } catch (MockitoAssertionError error) {
     55             assertThat(error).hasMessageContaining("1. Wanted but not invoked:");
     56             assertThat(error).hasMessageContaining("2. Wanted but not invoked:");
     57         }
     58     }
     59 
     60     @Test
     61     public void should_only_collect_failures_ignore_successful_verifications() {
     62         VerificationCollector collector = MockitoJUnit.collector().assertLazily();
     63 
     64         IMethods methods = mock(IMethods.class);
     65 
     66         verify(methods, never()).simpleMethod();
     67         verify(methods).byteReturningMethod();
     68 
     69         this.assertAtLeastOneFailure(collector);
     70     }
     71 
     72     @Test
     73     public void should_continue_collecting_after_failing_verification() {
     74         VerificationCollector collector = MockitoJUnit.collector().assertLazily();
     75 
     76         IMethods methods = mock(IMethods.class);
     77         methods.simpleMethod();
     78 
     79         verify(methods).byteReturningMethod();
     80         verify(methods).simpleMethod();
     81 
     82         this.assertAtLeastOneFailure(collector);
     83     }
     84 
     85     private void assertAtLeastOneFailure(VerificationCollector collector) {
     86         try {
     87             collector.collectAndReport();
     88             fail();
     89         } catch (MockitoAssertionError error) {
     90             assertThat(error).hasMessageContaining("1. Wanted but not invoked:");
     91             assertThat(error.getMessage()).doesNotContain("2.");
     92         }
     93     }
     94 
     95     @Test
     96     public void should_invoke_collector_rule_after_test() {
     97         JUnitCore runner = new JUnitCore();
     98         Result result = runner.run(VerificationCollectorRuleInner.class);
     99 
    100         assertThat(result.getFailureCount()).isEqualTo(1);
    101         assertThat(result.getFailures().get(0).getMessage()).contains("1. Wanted but not invoked:");
    102     }
    103 
    104     // This class is picked up when running a test suite using an IDE. It fails on purpose.
    105     public static class VerificationCollectorRuleInner {
    106 
    107         @Rule
    108         public VerificationCollector collector = MockitoJUnit.collector();
    109 
    110         @Test
    111         public void should_fail() {
    112             IMethods methods = mock(IMethods.class);
    113 
    114             verify(methods).simpleMethod();
    115         }
    116 
    117         @Test
    118         public void should_not_fail() {
    119             IMethods methods = mock(IMethods.class);
    120             methods.simpleMethod();
    121 
    122             verify(methods).simpleMethod();
    123         }
    124     }
    125 }
    126