• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.mockitousage.verification;
7 
8 import org.assertj.core.api.Assertions;
9 import org.assertj.core.api.ThrowableAssert;
10 import org.junit.After;
11 import org.junit.Before;
12 import org.junit.Ignore;
13 import org.junit.Rule;
14 import org.junit.Test;
15 import org.mockito.Mock;
16 import org.mockito.exceptions.verification.TooLittleActualInvocations;
17 import org.mockito.junit.MockitoRule;
18 import org.mockitousage.IMethods;
19 import org.mockitoutil.Stopwatch;
20 import org.mockitoutil.async.AsyncTesting;
21 
22 import java.util.concurrent.TimeUnit;
23 
24 import static org.mockito.Mockito.after;
25 import static org.mockito.Mockito.timeout;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.junit.MockitoJUnit.rule;
28 import static org.mockitoutil.Stopwatch.createNotStarted;
29 
30 public class VerificationWithTimeoutTest {
31 
32     @Rule public MockitoRule mockito = rule();
33 
34     private Stopwatch watch = createNotStarted();
35 
36     @Mock private IMethods mock;
37 
38     private AsyncTesting async;
39 
40     @Before
setUp()41     public void setUp() {
42         async = new AsyncTesting();
43     }
44 
45     @After
tearDown()46     public void tearDown() {
47         async.cleanUp();
48     }
49 
50     @Test
should_verify_with_timeout()51     public void should_verify_with_timeout() {
52         // when
53         async.runAfter(50, callMock('c'));
54         async.runAfter(500, callMock('c'));
55 
56         // then
57         verify(mock, timeout(200).only()).oneArg('c');
58         verify(mock).oneArg('c'); //sanity check
59     }
60 
61     @Test
should_verify_with_timeout_and_fail()62     public void should_verify_with_timeout_and_fail() {
63         // when
64         async.runAfter(200, callMock('c'));
65 
66         // then
67         Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
68             @Override
69             public void call() {
70                 verify(mock, timeout(50).only()).oneArg('c');
71             }
72         }).isInstanceOf(AssertionError.class).hasMessageContaining("Wanted but not invoked");
73         //TODO let's have a specific exception vs. generic assertion error + message
74     }
75 
76     @Test
77     @Ignore //TODO nice to have
should_verify_with_timeout_and_fail_early()78     public void should_verify_with_timeout_and_fail_early() {
79         // when
80         callMock('c');
81         callMock('c');
82 
83         watch.start();
84 
85         // then
86         Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
87             @Override
88             public void call() {
89                 verify(mock, timeout(2000)).oneArg('c');
90             }
91         }).isInstanceOf(AssertionError.class).hasMessageContaining("Wanted but not invoked");
92 
93         watch.assertElapsedTimeIsLessThan(1000, TimeUnit.MILLISECONDS);
94     }
95 
96     @Test
should_verify_with_times_x()97     public void should_verify_with_times_x() {
98         // when
99         async.runAfter(50, callMock('c'));
100         async.runAfter(100, callMock('c'));
101         async.runAfter(600, callMock('c'));
102 
103         // then
104         verify(mock, timeout(300).times(2)).oneArg('c');
105     }
106 
107     @Test
should_verify_with_times_x_and_fail()108     public void should_verify_with_times_x_and_fail() {
109         // when
110         async.runAfter(10, callMock('c'));
111         async.runAfter(200, callMock('c'));
112 
113         // then
114         Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
115             @Override
116             public void call() {
117                 verify(mock, timeout(100).times(2)).oneArg('c');
118             }
119         }).isInstanceOf(TooLittleActualInvocations.class);
120     }
121 
122     @Test
should_verify_with_at_least()123     public void should_verify_with_at_least() {
124         // when
125         async.runAfter(10, callMock('c'));
126         async.runAfter(50, callMock('c'));
127 
128         // then
129         verify(mock, timeout(200).atLeast(2)).oneArg('c');
130     }
131 
132     @Test
should_verify_with_at_least_once()133     public void should_verify_with_at_least_once() {
134         // when
135         async.runAfter(10, callMock('c'));
136         async.runAfter(50, callMock('c'));
137 
138         // then
139         verify(mock, timeout(200).atLeastOnce()).oneArg('c');
140     }
141 
142     @Test
should_verify_with_at_least_and_fail()143     public void should_verify_with_at_least_and_fail() {
144         // when
145         async.runAfter(10, callMock('c'));
146         async.runAfter(50, callMock('c'));
147 
148         // then
149         Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
150             public void call() {
151                 verify(mock, timeout(100).atLeast(3)).oneArg('c');
152             }
153         }).isInstanceOf(TooLittleActualInvocations.class);
154     }
155 
156     @Test
should_verify_with_only()157     public void should_verify_with_only() {
158         // when
159         async.runAfter(10, callMock('c'));
160         async.runAfter(300, callMock('c'));
161 
162         // then
163         verify(mock, timeout(100).only()).oneArg('c');
164     }
165 
166     @Test
167     @Ignore("not testable, probably timeout().only() does not make sense")
should_verify_with_only_and_fail()168     public void should_verify_with_only_and_fail() {
169         // when
170         async.runAfter(10, callMock('c'));
171         async.runAfter(50, callMock('c'));
172 
173         // then
174         Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
175             @Override
176             public void call() {
177                 verify(mock, after(200).only()).oneArg('c');
178             }
179         }).isInstanceOf(AssertionError.class);
180     }
181 
182     @Test
183     @Ignore //TODO nice to have
should_verify_with_only_and_fail_early()184     public void should_verify_with_only_and_fail_early() {
185         // when
186         callMock('c');
187         callMock('c');
188 
189         watch.start();
190 
191         // then
192         Assertions.assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
193             @Override
194             public void call() {
195                 verify(mock, timeout(2000).only()).oneArg('c');
196             }
197         }).isInstanceOf(AssertionError.class).hasMessageContaining("Wanted but not invoked"); //TODO specific exception
198 
199         watch.assertElapsedTimeIsLessThan(1000, TimeUnit.MILLISECONDS);
200     }
201 
callMock(final char c)202     private Runnable callMock(final char c) {
203         return new Runnable() {
204             @Override
205             public void run() {
206                 mock.oneArg(c);
207             }
208         };
209     }
210 }
211