View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit;
6   
7   import static org.junit.jupiter.api.Assertions.assertEquals;
8   import static org.junit.jupiter.api.Assertions.assertFalse;
9   import static org.junit.jupiter.api.Assertions.assertNotNull;
10  import static org.junit.jupiter.api.Assertions.assertNull;
11  import static org.junit.jupiter.api.Assertions.assertSame;
12  import static org.junit.jupiter.api.Assertions.assertTrue;
13  
14  import org.junit.Rule;
15  import org.junit.Test;
16  import org.junit.rules.ExpectedException;
17  
18  public final class MockInvocationTest {
19      @Rule
20      public final ExpectedException thrown = ExpectedException.none();
21  
22      public static class Collaborator {
23          int value;
24  
25          Collaborator() {
26          }
27  
28          public Collaborator(int i) {
29              value = i;
30          }
31  
32          public int getValue() {
33              return -1;
34          }
35  
36          public void setValue(int i) {
37              value = i;
38          }
39  
40          public String doSomething(boolean b, int[] i, String s) {
41              return s + b + i[0];
42          }
43  
44          public static boolean staticMethod() {
45              return true;
46          }
47      }
48  
49      static final class MockMethods extends MockUp<Collaborator> {
50          @Mock
51          static boolean staticMethod(Invocation context) {
52              assertNotNull(context);
53              assertNull(context.getInvokedInstance());
54              assertEquals(1, context.getInvocationCount());
55              return false;
56          }
57  
58          @Mock
59          int getValue(Invocation context) {
60              assertTrue(context.getInvokedInstance() instanceof Collaborator);
61              assertEquals(0, context.getInvocationIndex());
62              return 123;
63          }
64      }
65  
66      @Test
67      public void mockMethodsForMethodsWithoutParameters() {
68          new MockMethods();
69          assertFalse(Collaborator.staticMethod());
70          assertEquals(123, new Collaborator().getValue());
71      }
72  
73      @Test
74      public void instanceMockMethodForStaticMethod() {
75          new MockUp<Collaborator>() {
76              @Mock
77              boolean staticMethod(Invocation context) {
78                  assertNull(context.getInvokedInstance());
79                  assertEquals(context.getInvocationCount() - 1, context.getInvocationIndex());
80                  return context.getInvocationCount() <= 0;
81              }
82          };
83  
84          assertFalse(Collaborator.staticMethod());
85          assertFalse(Collaborator.staticMethod());
86      }
87  
88      @Test
89      public void mockMethodsWithInvocationParameter() {
90          new MockUp<Collaborator>() {
91              Collaborator instantiated;
92  
93              @Mock
94              void $init(Invocation inv, int i) {
95                  assertNotNull(inv.getInvokedInstance());
96                  assertTrue(i > 0);
97                  instantiated = inv.getInvokedInstance();
98              }
99  
100             @Mock
101             String doSomething(Invocation inv, boolean b, int[] array, String s) {
102                 assertNotNull(inv);
103                 assertSame(instantiated, inv.getInvokedInstance());
104                 assertEquals(1, inv.getInvocationCount());
105                 assertTrue(b);
106                 assertNull(array);
107                 assertEquals("test", s);
108                 return "mock";
109             }
110         };
111 
112         String s = new Collaborator(123).doSomething(true, null, "test");
113         assertEquals("mock", s);
114     }
115 
116     static class MockMethodsWithParameters extends MockUp<Collaborator> {
117         int capturedArgument;
118         Collaborator mockedInstance;
119 
120         @Mock
121         void $init(Invocation context, int i) {
122             capturedArgument = i + context.getInvocationCount();
123             assertNull(mockedInstance);
124             assertTrue(context.getInvokedInstance() instanceof Collaborator);
125             assertEquals(1, context.getInvokedArguments().length);
126         }
127 
128         @Mock
129         void setValue(Invocation context, int i) {
130             assertEquals(i, context.getInvocationIndex());
131             assertSame(mockedInstance, context.getInvokedInstance());
132             assertEquals(1, context.getInvokedArguments().length);
133         }
134     }
135 
136     @Test
137     public void mockMethodsWithParameters() {
138         MockMethodsWithParameters mock = new MockMethodsWithParameters();
139 
140         Collaborator col = new Collaborator(4);
141         mock.mockedInstance = col;
142 
143         assertEquals(5, mock.capturedArgument);
144         col.setValue(0);
145         col.setValue(1);
146     }
147 
148     @Test
149     public void useOfContextParametersForJREMethods() throws Exception {
150         new MockUp<Runtime>() {
151             @Mock
152             void runFinalizersOnExit(Invocation inv, boolean b) {
153                 assertNull(inv.getInvokedInstance());
154                 assertEquals(1, inv.getInvocationCount());
155                 assertTrue(b);
156             }
157 
158             @Mock
159             Process exec(Invocation inv, String command, String[] envp) {
160                 assertSame(Runtime.getRuntime(), inv.getInvokedInstance());
161                 assertEquals(0, inv.getInvocationIndex());
162                 assertNotNull(command);
163                 assertNull(envp);
164                 return null;
165             }
166         };
167 
168         // Runtime.runFinalizersOnExit(true);
169         assertNull(Runtime.getRuntime().exec("test", null));
170     }
171 }