1/*
2 * Copyright (c) 2017 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockitousage.junitrule;
6
7import org.junit.Rule;
8import org.junit.Test;
9import org.mockito.Mock;
10import org.mockito.quality.Strictness;
11import org.mockito.internal.junit.JUnitRule;
12import org.mockito.internal.util.SimpleMockitoLogger;
13import org.mockitousage.IMethods;
14import org.mockitoutil.ConcurrentTesting;
15import org.mockitoutil.SafeJUnitRule;
16
17import static org.junit.Assert.assertEquals;
18import static org.junit.Assert.assertTrue;
19import static org.mockito.Mockito.when;
20import static org.mockitoutil.TestBase.filterLineNo;
21
22public class StubbingWarningsMultiThreadingTest {
23
24    private SimpleMockitoLogger logger = new SimpleMockitoLogger();
25    @Rule public SafeJUnitRule rule = new SafeJUnitRule(new JUnitRule(logger, Strictness.WARN));
26    @Mock IMethods mock;
27
28    @Test public void using_stubbing_from_different_thread() throws Throwable {
29        //expect no warnings
30        rule.expectSuccess(new Runnable() {
31            public void run() {
32                assertTrue(logger.getLoggedInfo().isEmpty());
33            }
34        });
35
36        //when stubbing is declared
37        when(mock.simpleMethod()).thenReturn("1");
38        //and used from a different thread
39        ConcurrentTesting.inThread(new Runnable() {
40                    public void run() {
41                        mock.simpleMethod();
42                    }
43                });
44    }
45
46    @Test public void unused_stub_from_different_thread() throws Throwable {
47        //expect warnings
48        rule.expectSuccess(new Runnable() {
49            public void run() {
50                assertEquals(
51                    "[MockitoHint] StubbingWarningsMultiThreadingTest.unused_stub_from_different_thread (see javadoc for MockitoHint):\n" +
52                    "[MockitoHint] 1. Unused -> at org.mockitousage.junitrule.StubbingWarningsMultiThreadingTest.unused_stub_from_different_thread(StubbingWarningsMultiThreadingTest.java:0)\n",
53                        filterLineNo(logger.getLoggedInfo()));
54            }
55        });
56
57        //when stubbings are declared
58        when(mock.simpleMethod(1)).thenReturn("1");
59        when(mock.simpleMethod(2)).thenReturn("2");
60
61        //and one of the stubbings is used from a different thread
62        ConcurrentTesting.inThread(new Runnable() {
63            public void run() {
64                mock.simpleMethod(1);
65            }
66        });
67    }
68
69}
70