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.junitrunner; 6 7 import static org.junit.Assert.assertEquals; 8 import static org.mockito.Mockito.mock; 9 import static org.mockito.Mockito.times; 10 import static org.mockito.Mockito.verify; 11 import static org.mockito.Mockito.when; 12 13 import java.util.List; 14 15 import org.junit.Test; 16 import org.junit.runner.JUnitCore; 17 import org.junit.runner.Result; 18 import org.junit.runner.RunWith; 19 import org.mockito.Mock; 20 import org.mockito.exceptions.misusing.UnfinishedStubbingException; 21 import org.mockito.exceptions.verification.TooFewActualInvocations; 22 import org.mockito.junit.MockitoJUnitRunner; 23 import org.mockitousage.IMethods; 24 import org.mockitoutil.JUnitResultAssert; 25 import org.mockitoutil.TestBase; 26 27 public class SilentRunnerTest extends TestBase { 28 29 JUnitCore runner = new JUnitCore(); 30 31 @Test passing_test()32 public void passing_test() { 33 // when 34 Result result = runner.run(SomeFeature.class); 35 // then 36 JUnitResultAssert.assertThat(result).isSuccessful(); 37 } 38 39 @Test failing_test()40 public void failing_test() { 41 // when 42 Result result = runner.run(SomeFailingFeature.class); 43 // then 44 JUnitResultAssert.assertThat(result).fails(1, TooFewActualInvocations.class); 45 } 46 47 @Test failing_test_in_constructor()48 public void failing_test_in_constructor() { 49 // when 50 Result result = runner.run(FailsInConstructor.class); 51 // then 52 JUnitResultAssert.assertThat(result).fails(1, IllegalArgumentException.class); 53 } 54 55 @Test validates_framework_usage()56 public void validates_framework_usage() { 57 // when 58 Result result = runner.run(UsesFrameworkIncorrectly.class); 59 // then 60 JUnitResultAssert.assertThat(result) 61 .fails(1, "unfinished_stubbing_test_method", UnfinishedStubbingException.class); 62 } 63 64 @Test ignores_unused_stubs()65 public void ignores_unused_stubs() { 66 JUnitCore runner = new JUnitCore(); 67 // when 68 Result result = runner.run(HasUnnecessaryStubs.class); 69 // then 70 JUnitResultAssert.assertThat(result).isSuccessful(); 71 } 72 73 @RunWith(MockitoJUnitRunner.Silent.class) 74 public static class SomeFeature { 75 @Mock List<String> list; 76 77 @Test some_behavior()78 public void some_behavior() { 79 when(list.get(0)).thenReturn("0"); 80 assertEquals("0", list.get(0)); 81 } 82 } 83 84 @RunWith(MockitoJUnitRunner.Silent.class) 85 public static class SomeFailingFeature { 86 @Mock List<String> list; 87 88 @Test some_failing_behavior()89 public void some_failing_behavior() { 90 list.clear(); 91 verify(list, times(2)).clear(); 92 } 93 } 94 95 @RunWith(MockitoJUnitRunner.Silent.class) 96 public static class FailsInConstructor { 97 { 98 if (System.currentTimeMillis() > 0) { 99 throw new IllegalArgumentException("Boo!"); 100 } 101 } 102 103 @Mock List<String> list; 104 105 @Test some_behavior()106 public void some_behavior() {} 107 } 108 109 @RunWith(MockitoJUnitRunner.Silent.class) 110 public static class UsesFrameworkIncorrectly { 111 @Mock List<?> list; 112 113 @SuppressWarnings({"MockitoUsage", "CheckReturnValue"}) 114 @Test unfinished_stubbing_test_method()115 public void unfinished_stubbing_test_method() { 116 when(list.get(0)); // unfinished stubbing 117 } 118 } 119 120 /** 121 * The test class itself is passing but it has some unnecessary stubs 122 */ 123 @RunWith(MockitoJUnitRunner.Silent.class) 124 public static class HasUnnecessaryStubs { 125 IMethods mock1 = when(mock(IMethods.class).simpleMethod(1)).thenReturn("1").getMock(); 126 IMethods mock2 = when(mock(IMethods.class).simpleMethod(2)).thenReturn("2").getMock(); 127 IMethods mock3 = when(mock(IMethods.class).simpleMethod(3)).thenReturn("3").getMock(); 128 129 @Test usesStub()130 public void usesStub() { 131 assertEquals("1", mock1.simpleMethod(1)); 132 } 133 134 @Test usesStubWithDifferentArg()135 public void usesStubWithDifferentArg() { 136 assertEquals(null, mock2.simpleMethod(200)); 137 assertEquals(null, mock3.simpleMethod(300)); 138 } 139 } 140 } 141