19de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson/* 29de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Copyright 2011 Google Inc. 39de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * 49de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Licensed under the Apache License, Version 2.0 (the "License"); 59de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * you may not use this file except in compliance with the License. 69de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * You may obtain a copy of the License at 79de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * 89de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * http://www.apache.org/licenses/LICENSE-2.0 99de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * 109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Unless required by applicable law or agreed to in writing, software 119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * distributed under the License is distributed on an "AS IS" BASIS, 129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * See the License for the specific language governing permissions and 149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * limitations under the License. 159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonpackage com.google.testing.littlemock; 189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyBoolean; 209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyByte; 219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyChar; 229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyDouble; 239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyFloat; 249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyInt; 259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyLong; 269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyObject; 279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyShort; 289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyString; 299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.anyTimes; 309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.atLeast; 319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.atLeastOnce; 329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.atMost; 339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.between; 349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.checkForProgrammingErrorsDuringTearDown; 359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.doAnswer; 369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.doNothing; 379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.doReturn; 389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.doThrow; 399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.eq; 4040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudsonimport static com.google.testing.littlemock.LittleMock.inOrder; 419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.initMocks; 429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.isA; 432a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.matches; 449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.mock; 459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.never; 469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.reset; 47ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.timeout; 489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.times; 499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.verify; 509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.verifyNoMoreInteractions; 519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport static com.google.testing.littlemock.LittleMock.verifyZeroInteractions; 529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 532a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudsonimport com.google.testing.littlemock.LittleMock.ArgumentMatcher; 5440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudsonimport com.google.testing.littlemock.LittleMock.InOrder; 552a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson 569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport junit.framework.TestCase; 579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.io.IOException; 599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.lang.reflect.InvocationHandler; 609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.lang.reflect.Method; 619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.lang.reflect.Proxy; 629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.util.ArrayList; 639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.util.List; 649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonimport java.util.concurrent.Callable; 65ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport java.util.concurrent.CancellationException; 66ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport java.util.concurrent.CountDownLatch; 67ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport java.util.concurrent.ExecutionException; 68ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport java.util.concurrent.ExecutorService; 69ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport java.util.concurrent.Executors; 70ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudsonimport java.util.concurrent.Future; 719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson/** 739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Unit tests for the LittleMock class. 749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * 759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * @author hugohudson@gmail.com (Hugo Hudson) 769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudsonpublic class LittleMockTest extends TestCase { 789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Mock private Foo mFoo; 799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Mock private Bar mBar; 809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Mock private BarSubtype mBarSubtype; 819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Captor private ArgumentCaptor<String> mCaptureString; 829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Captor private ArgumentCaptor<String> mCaptureAnotherString; 839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Captor private ArgumentCaptor<Integer> mCaptureInteger; 849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Captor private ArgumentCaptor<Callback> mCaptureCallback; 85ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson private ExecutorService mExecutorService; 869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson protected void setUp() throws Exception { 899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson super.setUp(); 909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson LittleMock.initMocks(this); 91ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mExecutorService = Executors.newCachedThreadPool(); 929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 95ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson protected void tearDown() throws Exception { 96ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mExecutorService.shutdown(); 97ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson super.tearDown(); 989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Simple interface for testing against. */ 1019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public interface Callback { 1029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void callMeNow(); 1039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Simple interface for testing against. */ 1069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public interface Foo { 1079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public int anInt(); 1089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public boolean aBoolean(); 1099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public byte aByte(); 1109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public short aShort(); 1119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public long aLong(); 1129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public float aFloat(); 1139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public double aDouble(); 1149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public char aChar(); 1159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String aString(); 1169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Object anObject(); 1179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Foo anInterface(); 1189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void add(String input); 1199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void clear(); 1209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String get(int index); 1219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String lookup(String string); 1229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void getResultLater(Callback callback); 1239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByInt(int input); 1249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByBoolean(boolean input); 1259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByByte(byte input); 1269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByShort(short input); 1279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByLong(long input); 1289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByFloat(float input); 1299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByDouble(double input); 1309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String findByChar(char input); 1319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void takesObject(Object input); 1329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void takesList(List<String> input); 1339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void takesBar(Bar bar); 1349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void exceptionThrower() throws Exception; 1359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Bar aBar(); 1369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public BarSubtype aBarSubtype(); 1379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Simple interface for testing against. */ 1409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public interface Bar { 1419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void doSomething(); 1429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public String twoStrings(String first, String second); 1439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void mixedArguments(int first, String second); 1449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void getResultLater(Callback callback); 1459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Subtype of Bar. */ 1489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public interface BarSubtype extends Bar { 1499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void doSomethingElse(); 1509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Another interface for testing with. */ 1539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public interface OnClickListener { 1549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson void onClick(Bar bar); 1559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDefaultReturnTypesForNewMocks() { 1589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0, mFoo.anInt()); 1599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(false, mFoo.aBoolean()); 1609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0, mFoo.aByte()); 1619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0, mFoo.aShort()); 1629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0L, mFoo.aLong()); 1639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0.0f, mFoo.aFloat()); 1649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0.0d, mFoo.aDouble()); 1659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals('\u0000', mFoo.aChar()); 1669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(null, mFoo.aString()); 1679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(null, mFoo.anObject()); 1689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(null, mFoo.anInterface()); 1699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_FailsIfNotDoneOnAProxy() { 172ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 173ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify("hello").contains("something"); 174ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 175ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 1769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_FailsIfNotCreatedByOurMockMethod() { 179ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 180ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(createNotARealMock()).add("something"); 181ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 182ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 1839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_SuccessfulVerification() { 1869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something"); 1879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("something"); 1889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_SuccessfulVerification_NormalOrder() { 1919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something"); 1929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something else"); 1939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("something"); 1949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("something else"); 1959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_SuccessfulVerification_ReverseOrder() { 1989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something"); 1999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something else"); 2009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("something else"); 2019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("something"); 2029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_MeansOnlyOnceSoShouldFailIfCalledTwice() { 2059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something"); 2069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something"); 207ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 208ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).add("something"); 209ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 210ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_FailedVerification_CalledWithWrongArgument() { 2149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("something else"); 215ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 216ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).add("something"); 217ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 218ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_FailedVerification_WasNeverCalled() { 222ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 223ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).add("something"); 224ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 225ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_Succeeds() { 2299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, LittleMock.times(2)).add("jim"); 2329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_ButThreeTimesFails() { 2359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 238ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 239ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, LittleMock.times(2)).add("jim"); 240ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 241ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_ButOnceFails() { 2459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 246ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 247ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, LittleMock.times(2)).add("jim"); 248ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 249ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_DifferentStringsFails() { 2539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("bob"); 255ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 256ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, LittleMock.times(2)).add("jim"); 257ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 258ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_WorksWithAnyString() { 2629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("bob"); 2649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, LittleMock.times(2)).add(anyString()); 2659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_FailsIfJustOnceWithAnyString() { 2689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("bob"); 269ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 270ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, LittleMock.times(2)).add(anyString()); 271ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 272ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_TimesTwice_FailsIfThreeTimesWithAnyString() { 2769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("bob"); 2779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 2789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("james"); 279ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 280ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, LittleMock.times(2)).add(anyString()); 281ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 282ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_Never_Succeeds() { 2869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, never()).add("jim"); 2879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, never()).anInt(); 2889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_Never_FailsIfWasCalled() { 2919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 292ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 293ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, never()).add("jim"); 294ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 295ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 2969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 2979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 2989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_Never_PassesIfArgumentsDontMatch() { 2999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("bobby"); 3009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, never()).add("jim"); 3019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtLeastOnce_SuceedsForOneCall() { 3049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeastOnce()).add("jim"); 3069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtLeastOnce_SuceedsForThreeCalls() { 3099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeastOnce()).add("jim"); 3139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtLeastOnce_FailsForNoCalls() { 316ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 317ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, atLeastOnce()).add("jim"); 318ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 319ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 3209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtLeastThreeTimes_SuceedsForThreeCalls() { 3239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeast(3)).add("jim"); 3279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtLeastThreeTimes_SuceedsForFiveCalls() { 3309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeast(3)).add("jim"); 3369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtLeastThreeTimes_FailsForTwoCalls() { 3399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 341ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 342ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, atLeast(3)).add("jim"); 343ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 344ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 3459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtMostThreeTimes_SuceedsForThreeCalls() { 3489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atMost(3)).add("jim"); 3529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtMostThreeTimes_FailsForFiveCalls() { 3559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 360ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 361ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, atMost(3)).add("jim"); 362ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 363ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 3649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtMostThreeTimes_SucceedsForTwoCalls() { 3679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atMost(3)).add("jim"); 3709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_AtMostThreeTimes_SucceedsForNoCalls() { 3739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atMost(3)).add("jim"); 3749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_BetweenTwoAndFour_SucceedsForTwoCalls() { 3779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, between(2, 4)).add("jim"); 3809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_BetweenTwoAndFour_SucceedsForFourCalls() { 3839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 3879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, between(2, 4)).add("jim"); 3889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_BetweenTwoAndFour_FailsForOneCall() { 3919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 392ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 393ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, between(2, 4)).add("jim"); 394ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 395ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 3969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 3979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 3989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerify_BetweenTwoAndFour_FailsForFiveCalls() { 3999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 4009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 4019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 4029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 4039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jim"); 404ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 405ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, LittleMock.between(2, 4)).add("jim"); 406ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 407ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 4089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_SimpleReturn() { 4119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("first").when(mFoo).get(0); 4129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("first", mFoo.get(0)); 4139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_LastStubCallWins() { 4169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("first").when(mFoo).get(0); 4179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("second").when(mFoo).get(0); 4189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("second", mFoo.get(0)); 4199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_CorrectStubMethodIsChosen() { 4229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("one").when(mFoo).get(1); 4239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("two").when(mFoo).get(2); 4249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("one", mFoo.get(1)); 4259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("two", mFoo.get(2)); 4269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_UnstubbedMethodStillReturnsDefault() { 4299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("one").when(mFoo).get(1); 4309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(null, mFoo.get(2)); 4319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_CalledOnString() { 434ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 435ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn("first").when("hello").contains("something"); 436ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 437ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 4389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_CalledOnNonMock() { 441ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 442ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn("first").when(createNotARealMock()).get(0); 443ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 444ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 4459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturnWhen_CanAlsoBeVerified() { 4489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Mockito home page suggests that you don't verify stubbed calls. 4499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // I agree. They support it anyway. So will I. 4509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("one").when(mFoo).get(8); 4519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.get(8); 4529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).get(8); 4539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_CanPassIntForIntMethod() { 4569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(90).when(mFoo).anInt(); 4579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(90, mFoo.anInt()); 4589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Interesting, you have to explicity convert the Integer class back into an int before it 4619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // is happy to accept this. 4629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_CanPassIntegerClassForIntMethod() { 4639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn((int) Integer.valueOf(10)).when(mFoo).anInt(); 4649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(10, mFoo.anInt()); 4659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_PrimitiveLong() { 4689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn((long) Long.valueOf(10L)).when(mFoo).aLong(); 4699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(10L, mFoo.aLong()); 4709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_PrimitiveTypes() { 4739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(5).when(mFoo).anInt(); 4749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(5, mFoo.anInt()); 4759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn((short) 5).when(mFoo).aShort(); 4769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(5, mFoo.aShort()); 4779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(true).when(mFoo).aBoolean(); 4789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(true, mFoo.aBoolean()); 4799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn((byte) 3).when(mFoo).aByte(); 4809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(3, mFoo.aByte()); 4819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(0.6f).when(mFoo).aFloat(); 4829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0.6f, mFoo.aFloat()); 4839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(0.7).when(mFoo).aDouble(); 4849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(0.7, mFoo.aDouble()); 4859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn('c').when(mFoo).aChar(); 4869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals('c', mFoo.aChar()); 4879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(null, mFoo.anInterface()); 4889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoThrow_SimpleException() { 4919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doThrow(new RuntimeException()).when(mFoo).aDouble(); 492ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 493ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aDouble(); 494ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 495ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (RuntimeException expected) {} 4969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 4979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 4989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoThrow_IfItDoesntMatchItIsntThrown() { 4999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doThrow(new RuntimeException()).when(mFoo).aDouble(); 5009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aChar(); 5019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoThrow_KeepsThrowingForever() { 5049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doThrow(new RuntimeException()).when(mFoo).aDouble(); 5059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 5069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aDouble(); 507ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 508ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (RuntimeException expected) {} 5099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // This second call should also throw a RuntimeException. 510ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 511ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aDouble(); 512ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 513ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (RuntimeException expected) {} 5149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoNothing() { 5179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doNothing().when(mFoo).add("first"); 5189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("first"); 5199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyZeroInteractions_PassesWhenNothingHasHappened() { 5229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyZeroInteractions(mFoo); 5239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyZeroInteractions_FailsIfSomethingHasHappened() { 5269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aBoolean(); 527ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 528ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verifyZeroInteractions(mFoo); 529ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 530ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 5319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyZeroInteractions_HappyWithMultipleArguments() { 5349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyZeroInteractions(mFoo, mBar); 5359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyZeroInteractions_ShouldFailEvenIfOtherInteractionsWereFirstVerified() { 5389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("test"); 5399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("test"); 540ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 541ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verifyZeroInteractions(mFoo); 542ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 543ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 5449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEq_Method() { 5479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("test"); 5489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add(eq("test")); 5499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEq_MethodWithTwoSameTypeParameters() { 5529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mBar.twoStrings("first", "test"); 5539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mBar).twoStrings(eq("first"), eq("test")); 5549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEq_MethodWithTwoDifferentTypeParameters() { 5579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mBar.mixedArguments(8, "test"); 5589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mBar).mixedArguments(eq(8), eq("test")); 5599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEq_MethodFailsIfNotEqual() { 5629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("bob"); 563ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 564ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).add(eq("jim")); 565ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 566ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 5679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEq_MethodFailsIfJustOneIsNotEqual() { 5709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mBar.twoStrings("first", "second"); 571ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 572ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mBar).twoStrings(eq("first"), eq("third")); 573ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 574ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 5759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEq_MethodFailsIfSameParamsButInWrongOrder() { 5789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mBar.twoStrings("first", "second"); 579ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 580ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mBar).twoStrings(eq("second"), eq("first")); 581ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 582ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 5839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCapture_SimpleCapture() { 5869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // We verify that there are zero matchers by using the check for programming errors method. 5879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 5889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("test"); 5899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add(mCaptureString.capture()); 5909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("test", mCaptureString.getValue()); 5919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 5929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 5939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCapture_DuringStubbing() { 5959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 5969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("hello").when(mFoo).lookup(mCaptureString.capture()); 5979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 5989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("hello", mFoo.lookup("what")); 5999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("what", mCaptureString.getValue()); 6009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCapture_TwoCallbacksDuringStubbing() { 6039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 6049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doNothing().when(mFoo).add(mCaptureString.capture()); 6059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doNothing().when(mFoo).getResultLater(mCaptureCallback.capture()); 6069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("hi"); 6089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("hi", mCaptureString.getValue()); 6099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson Callback callback = createNoOpCallback(); 6119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.getResultLater(callback); 6129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(callback, mCaptureCallback.getValue()); 6139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 6. Is this impossible to fix? You can't pass a 6169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // createCapture().capture() into a method expecting an int, because the capture 6179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // method returns null, and that gets auto-boxed to Integer on the way out of the 6189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // capture method, then auto-unboxed into an int when being passed to the underlying 6199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // method, which gives the NPE. How best can we fix this? 6209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // It's not like you need to anyway - there's no point / need to capture a primitive, 6219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // just use eq(5) for example. 6229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCapture_NPEWhenUnboxing() { 6239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 6249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mBar.mixedArguments(5, "ten"); 6259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mBar).mixedArguments(mCaptureInteger.capture(), mCaptureString.capture()); 6269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // These lines are never reached, the previous line throws an NPE. 6279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson fail("You shouldn't be able to reach here"); 6289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(Integer.valueOf(5), mCaptureInteger.getValue()); 6299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("ten", mCaptureString.getValue()); 6309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } catch (NullPointerException e) { 6319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Expected, unfortunately. 6329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Now also we're in the situation where we have some captures hanging about in the static 6339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // variable, which will cause the tear down of this method to fail - we can clear them 6349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // as follows: 6359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 6369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 6379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson fail("Expected an IllegalStateException"); 6389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } catch (IllegalStateException e2) { 6399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Expected. 6409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCapture_MultiCapture() { 6459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.lookup("james"); 6469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("whinny"); 6479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("jessica"); 6489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).lookup(mCaptureString.capture()); 6499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeastOnce()).add(mCaptureAnotherString.capture()); 6509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("james", mCaptureString.getValue()); 6519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("jessica", mCaptureAnotherString.getValue()); 6529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(newList("whinny", "jessica"), mCaptureAnotherString.getAllValues()); 6539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testAnyString() { 6569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("jim").when(mFoo).lookup(anyString()); 6579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("jim", mFoo.lookup("barney")); 6589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testAnyString_ObjectArgument() { 6619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // It can also be passed to a method that takes object. 6629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesObject("barney"); 6639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesObject(anyString()); 6649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testAnyString_ObjectValue() { 6679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesObject(new Object()); 668ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 669ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).takesObject(anyString()); 670ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 671ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 6729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testAnyObject() { 6759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("jim").when(mFoo).lookup((String) anyObject()); 6769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("jim", mFoo.lookup("barney")); 6779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testAnyPrimitives() { 6809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByBoolean(true); 6819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByInt(10000); 6829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByByte((byte) 250); 6839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByShort((short) 6666); 6849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByLong(13L); 6859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByFloat(8f); 6869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByDouble(1.1); 6879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByChar('h'); 6889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByBoolean(anyBoolean()); 6899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByInt(anyInt()); 6909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByByte(anyByte()); 6919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByShort(anyShort()); 6929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByLong(anyLong()); 6939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByFloat(anyFloat()); 6949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByDouble(anyDouble()); 6959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).findByChar(anyChar()); 6969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 6979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 6989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testAnyPrimitivesWhenMatching() { 6999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("a").when(mFoo).findByBoolean(anyBoolean()); 7009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("b").when(mFoo).findByInt(anyInt()); 7019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("c").when(mFoo).findByByte(anyByte()); 7029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("d").when(mFoo).findByShort(anyShort()); 7039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("e").when(mFoo).findByLong(anyLong()); 7049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("f").when(mFoo).findByFloat(anyFloat()); 7059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("g").when(mFoo).findByDouble(anyDouble()); 7069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("h").when(mFoo).findByChar(anyChar()); 7079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("a", mFoo.findByBoolean(true)); 7089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("b", mFoo.findByInt(388)); 7099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("c", mFoo.findByByte((byte) 38)); 7109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("d", mFoo.findByShort((short) 16)); 7119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("e", mFoo.findByLong(1000000L)); 7129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("f", mFoo.findByFloat(15.3f)); 7139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("g", mFoo.findByDouble(13.3)); 7149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("h", mFoo.findByChar('i')); 7159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testReset_NoInteractionsAfterReset() { 7189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aByte(); 7199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson reset(mFoo); 7209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyZeroInteractions(mFoo); 7219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testReset_VerifyFailsAfterReset() { 7249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aByte(); 7259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson reset(mFoo); 726ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 727ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).aByte(); 728ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 729ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 7309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCapture_BothBeforeAndAfter() { 7339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doNothing().when(mFoo).add(mCaptureString.capture()); 7349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("first"); 7359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add(mCaptureAnotherString.capture()); 7369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("first", mCaptureString.getValue()); 7379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals("first", mCaptureAnotherString.getValue()); 7389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoAction_NormalOperation() { 7419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new Callable<Boolean>() { 7429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 7439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Boolean call() throws Exception { 7449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return Boolean.TRUE; 7459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }).when(mFoo).aBoolean(); 7479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(true, mFoo.aBoolean()); 7489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testComplexSituationWithCallback() { 7519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // I want to specify that when hasCallback(Callback) method is called, the framework 7529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // should immediately call on the captured callback. 7539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new CallCapturedCallbackCallable()) 7549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson .when(mBar).getResultLater(mCaptureCallback.capture()); 7559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // The test. 7579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mBar.getResultLater(new Callback() { 7589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 7599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void callMeNow() { 7609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.add("yes"); 7619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }); 7639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("yes"); 7659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoAction_CanThrowDeclaredException() throws Exception { 7689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new Callable<Void>() { 7699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 7709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Void call() throws Exception { 7719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw new IOException("Problem"); 7729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }).when(mFoo).exceptionThrower(); 774ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 775ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.exceptionThrower(); 776ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 777ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IOException expected) {} 7789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoAction_CanThrowUndelcaredException() { 7819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new Callable<Void>() { 7829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 7839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Void call() throws Exception { 7849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson throw new RuntimeException("Problem"); 7859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }).when(mFoo).aBoolean(); 787ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 788ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aBoolean(); 789ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 790ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (RuntimeException expected) {} 7919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 7939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testRunThisIsAnAliasForDoAction() { 7949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new Callable<Boolean>() { 7959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 7969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Boolean call() throws Exception { 7979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return Boolean.TRUE; 7989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 7999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }).when(mFoo).aBoolean(); 8009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(true, mFoo.aBoolean()); 8019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyingTwice() { 8049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Behaviour from Mockito docs online seems to be undefined for what should happen if you 8059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // try to verify the same behaviour twice. 8069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // I'm going to make a call on this one until I have more concrete information, and my 8079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // call is that it is okay to verify the same thing twice - a verify doesn't "consume" 8089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // the other verifications. 8099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Thus this will pass: 8109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aByte(); 8119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).aByte(); 8129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).aByte(); 8139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyNoMoreInteractions_SuccessWhenNoInteractions() { 8169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Not absolutely certain how this is supposed to behave. 8179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // My guess is that every verify "tags" all the methods it verifies against. 8189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Then verifyNoMoreInteractions() will pass only if there are no "untagged" method calls. 8199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Thus, for a start, no interactions will pass. 8209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mFoo, mBar); 8219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyNoMoreInteractions_SuccessWhenOneActionWasVerified() { 8249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aBoolean(); 8259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).aBoolean(); 8269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mFoo, mBar); 8279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyNoMoreInteractions_FailsWhenOneActionWasNotVerified() { 8309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aBoolean(); 831ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 832ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verifyNoMoreInteractions(mFoo, mBar); 833ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 834ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 8359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyNoMoreInteractions_SucceedsWhenAllActionsWereVerified() { 8389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.get(3); 8399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.get(20); 8409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeastOnce()).get(anyInt()); 8419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mFoo); 8429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyNoMoreInteractions_FailsWhenMostButNotAllActionsWereVerified() { 8459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.get(3); 8469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.get(20); 8479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aByte(); 8489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, atLeastOnce()).get(anyInt()); 849ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 850ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verifyNoMoreInteractions(mFoo); 851ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 852ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 8539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyNoMoreInteractions_ShouldIngoreStubbedCalls() { 8569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("hi").when(mFoo).get(8); 8579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.get(8); 8589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mFoo); 8599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testMatchers_WrongNumberOfMatchersOnStubbingCausesError() { 862ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 863ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn("hi").when(mBar).twoStrings("jim", eq("bob")); 864ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 865ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 8669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testMatchers_WrongNumberOfMatchersOnVerifyCausesError() { 869ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 870ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mBar).twoStrings("jim", eq("bob")); 871ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 872ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 8739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCreateACaptureButDontUseItShouldFailAtNextVerify() { 8769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // If we create a capture illegally, outside of a method call, like so: 8779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mCaptureString.capture(); 8789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Then we will have illegally created an extra matcher object that we shouldn't have 8799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // created that is now sitting on the stack, and that will confuse the next true method 8809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // call on the mock object. 8819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Thus we should check in the verify() method that there are *no matchers* on the static 8829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // list, as this would indicate a programming error such as the above. 883ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 884ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, anyTimes()).aBoolean(); 885ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 886ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 8879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCreateACaptureButDontUseItShouldFailAtNextVerify_AlsoNoMoreInteractions() { 8909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Same result desired as in previous test. 8919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mCaptureString.capture(); 892ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 893ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verifyNoMoreInteractions(mFoo); 894ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 895ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 8969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 8979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 8989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCreateACaptureButDontUseItShouldFailAtNextVerify_AlsoZeroInteraction() { 8999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mCaptureString.capture(); 900ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 901ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verifyZeroInteractions(mFoo); 902ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 903ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 9049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCheckStaticVariablesMethod() { 9079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // To help us avoid programming errors, I'm adding a method that you can call from tear down, 9089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // which will explode if there is anything still left in your static variables at the end 9099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // of the test (so that you know you did something wrong) and that also clears that static 9109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // variable (so that the next test won't fail). It should fail if we create a matcher 9119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // be it a capture or anything else that is then not consumed. 9129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson anyInt(); 913ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 914ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 915ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 916ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 9179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCantPassNullToVerifyCount() { 920ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 921ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, null).aBoolean(); 922ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 923ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 9249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testInjectionInNestedClasses() throws Exception { 9279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson class Outer { 9289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Mock protected Foo outerMock; 9299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson class Inner extends Outer { 9319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Mock protected Foo innerMock; 9329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson Inner inner = new Inner(); 9349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertNull(inner.innerMock); 9359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertNull(inner.outerMock); 9369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson initMocks(inner); 9379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertNotNull(inner.innerMock); 9389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertNotNull(inner.outerMock); 9399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testIsA_Succeeds() { 9429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesObject(new Object()); 9439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesObject(isA(Object.class)); 9449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testIsA_WithSubclass() { 9479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesObject("hello"); 9489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesObject(isA(Object.class)); 9499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesObject(isA(String.class)); 9509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testIsA_FailsWithSuperclass() { 9539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesObject(new Object()); 954ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 955ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).takesObject(isA(String.class)); 956ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 957ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 9589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testIsA_WillAcceptNull() { 9619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesObject(null); 9629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesObject(isA(Object.class)); 9639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesObject(isA(String.class)); 9649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testIsA_MatchSubtype() { 9679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesBar(mBarSubtype); 9689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesBar(isA(BarSubtype.class)); 9699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testIsA_MatchSubtypeFailed() { 9729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesBar(mBar); 973ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 974ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).takesBar(isA(BarSubtype.class)); 975ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 976ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 9779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyEquals_ShouldFail() { 9809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.equals(null); 981ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 982ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).equals(null); 983ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 984ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 9859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyHashCode_ShouldFail() { 9889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.hashCode(); 989ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 990ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).hashCode(); 991ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 992ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 9939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 9949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 9959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testVerifyToString_ShouldFail() { 9969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.toString(); 997ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 998ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).toString(); 999ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1000ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 10019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testStubEquals_ShouldFail() { 1004ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1005ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(false).when(mFoo).equals(null); 1006ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1007ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 10089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testStubHashCode_ShouldFail() { 1011ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1012ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(0).when(mFoo).hashCode(); 1013ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1014ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 10159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testStubToString_ShouldFail() { 1018ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1019ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn("party").when(mFoo).toString(); 1020ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1021ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 10229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testEqualsMethod_DoesntCountAsInteraction() { 10259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.takesBar(mBar); 10269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).takesBar(mBar); 10279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mBar); 10289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testHashCodeMethod_DoesntCountAsInteraction() { 10319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.hashCode(); 10329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mFoo); 10339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testToStringMethod_DoesntCountAsInteraction() { 10369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.toString(); 10379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyNoMoreInteractions(mFoo); 10389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testEquals_OnMock() { 10419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertTrue(mFoo.equals(mFoo)); 10429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testHashCode_OnMock() { 10459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // The hashCode() is checked against zero, the default int value, to make sure it is actually 10469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // being treated differently. 10479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // It is possible for a hashCode() to be zero, but very unlikely. 10489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertNotSame(0, mFoo.hashCode()); 10499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testToString_OnMock() { 10529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertTrue(mFoo.toString().contains(Foo.class.getName())); 10539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testErrorMessages_NoArgMethodAndNoInteractions() { 10569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /* I would like the error message to look like this: 10579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Expected exactly 2 calls to: 10589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * mFoo.aBoolean() 10599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * at the.line.where.the.verify.happened:xxx 10609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * 10619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * No method calls happened to this mock 10629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 10639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int verifyLineNumber = 0; 10649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 10659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyLineNumber = getNextLineNumber(); 10669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo, times(2)).aBoolean(); 10679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson fail("Should have thrown an assertion error"); 10689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } catch (AssertionError e) { 10699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Good, verify that the message is exactly as expected. 10709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson String expectedMessage = 10719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson "\nExpected exactly 2 calls to:\n" 10729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " mFoo.aBoolean()\n" 10739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " at " + singleLineStackTrace(verifyLineNumber) + "\n" 10749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + "\n" 1075ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson + "No method calls happened on this mock\n"; 10769de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(expectedMessage, e.getMessage()); 10779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 10799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 10809de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testErrorMessages_SomeArgsMethodAndSomeInteractions() { 10819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /* I would like the error message to look like this: 10829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Expected exactly 1 call to: 10839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * mFoo.add(String) 10849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * at the.line.where.the.verify.happened:xxx 10859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * 10869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Method calls that did happen: 10879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * mFoo.aByte() 10889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * at the.line.where.the.byte.happened:xxx 10899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * mFoo.findByBoolean(boolean) 10909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * at the line.where.the.boolean.happened:xxx 10919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 10929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int aByteLineNumber = 0; 10939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int findByBooleanLineNumber = 0; 10949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int verifyLineNumber = 0; 10959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 10969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson aByteLineNumber = getNextLineNumber(); 10979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aByte(); 10989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson findByBooleanLineNumber = getNextLineNumber(); 10999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.findByBoolean(true); 11009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verifyLineNumber = getNextLineNumber(); 11019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).add("jim"); 11029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson fail("Should have thrown an assertion error"); 11039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } catch (AssertionError e) { 11049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Good, verify that the message is exactly as expected. 11059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson String expectedMessage = 11069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson "\nExpected exactly 1 call to:\n" 11079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " mFoo.add(String)\n" 11089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " at " + singleLineStackTrace(verifyLineNumber) + "\n" 11099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + "\n" 11109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + "Method calls that did happen:\n" 11119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " mFoo.aByte()\n" 11129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " at " + singleLineStackTrace(aByteLineNumber) + "\n" 11139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " mFoo.findByBoolean(boolean)\n" 11149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " at " + singleLineStackTrace(findByBooleanLineNumber) + "\n"; 11159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(expectedMessage, e.getMessage()); 11169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testErrorMessage_DoReturnExplainsWhatWentWrong() { 11209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /* I would like the error message to look like this: 11219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Can't return Long from stub for: 11229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * (int) mFoo.anInt() 11239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * at the.line.where.the.assignment.happened:xxx 11249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 11259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int lineNumber = 0; 11269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 11279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson lineNumber = getNextLineNumber(); 11289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(10L).when(mFoo).anInt(); 11299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson fail("Should have thrown an IllegalArgumentException"); 11309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } catch (IllegalArgumentException e) { 11319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Good, expected, verify the message. 11329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson String expectedMessage = 11339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson "\nCan't return Long from stub for:\n" 11349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " (int) mFoo.anInt()\n" 11359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " at " + singleLineStackTrace(lineNumber) + "\n"; 11369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(expectedMessage, e.getMessage()); 11379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testErrorMessage_DoReturnAlsoHasGoodErrorMessageForVoidMethods() { 11419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /* I would like the error message to look like this: 11429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * Can't return String from stub for: 11439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * (void) mFoo.add(String) 11449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson * at the.line.where.the.assignment.happened:xxx 11459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson */ 11469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson int lineNumber = 0; 11479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson try { 11489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson lineNumber = getNextLineNumber(); 11499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("hello").when(mFoo).add("jim"); 11509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson fail("Should have thrown an IllegalArgumentException"); 11519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } catch (IllegalArgumentException e) { 11529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Good, expected, verify the message. 11539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson String expectedMessage = 11549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson "\nCan't return String from stub for:\n" 11559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " (void) mFoo.add(String)\n" 11569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson + " at " + singleLineStackTrace(lineNumber) + "\n"; 11579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertEquals(expectedMessage, e.getMessage()); 11589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldFailSinceDoubleIsNotAString() { 1162ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1163ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn("hello").when(mFoo).aDouble(); 1164ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1165ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 11669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldPassSinceStringCanBeReturnedFromObjectMethod() { 11699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn("hello").when(mFoo).anObject(); 11709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldFailSinceObjectCantBeReturnedFromString() { 1173ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1174ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(new Object()).when(mFoo).aString(); 1175ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1176ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 11779de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11789de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11799de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldFailSinceBarIsNotSubtypeOfBarSubtype() { 1180ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1181ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(mBar).when(mFoo).aBarSubtype(); 1182ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1183ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 11849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldPassSinceBarSubTypeIsABar() { 11879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(mBarSubtype).when(mFoo).aBar(); 11889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 7. Should fix this. 11919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson// @ShouldThrow(IllegalArgumentException.class) 11929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldFailBecauseNullIsNotAByte() { 11939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(null).when(mFoo).aByte(); 11949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 11959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 11969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 7. Should fix this. 11979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Once we fix the previous test we won't need this one. 11989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // I'm just demonstrating that currently this fails with NPE at use-time not at stub-time. 11999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldFailBecauseNullIsNotAByte2() { 12009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(null).when(mFoo).aByte(); 1201ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1202ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aByte(); 1203ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1204ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (NullPointerException expected) {} 12059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoReturn_ThisShouldPassSinceNullIsAnObject() { 12089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doReturn(null).when(mFoo).anObject(); 12099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 7. Should fix this. 12129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // At present we aren't catching this, and would have difficulty doing so since we don't know 12139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // the type of the callable. 12149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson// @ShouldThrow(IllegalArgumentException.class) 12159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoAnswer_ThisShouldFailSinceStringIsNotAByte() { 12169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new Callable<String>() { 12179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override public String call() throws Exception { return "hi"; } 12189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }).when(mFoo).aByte(); 12199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 7. Should fix this to give proper message. 12229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // We could at least give a good message saying why you get failure - saying that your string 12239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // is not a byte, and pointing to where you stubbed it. 12249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoAnswer_ThisShouldFailSinceStringIsNotAByte2() { 12259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson doAnswer(new Callable<String>() { 12269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override public String call() throws Exception { return "hi"; } 12279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }).when(mFoo).aByte(); 1228ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1229ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aByte(); 1230ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1231ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (ClassCastException expected) {} 12329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12339de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12349de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoAnswer_ShouldHaveSimpleNameOnReturnValue() { 1235ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1236ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn("hi").when(mFoo).aBar(); 1237ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1238ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 12399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCantCreateMockOfNullType() { 1242ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1243ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mock(null); 1244ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1245ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalArgumentException expected) {} 12469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testCreateMockWithNullFieldName() { 12499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson OnClickListener mockClickListener = mock(OnClickListener.class); 1250ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1251ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mockClickListener).onClick(null); 1252ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1253ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 12549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void testDoubleVerifyNoProblems() { 12579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Reusing a mock after a verify should be fine. 12589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // There was a bug with this, let's check it doesn't regress. 12599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aBar(); 12609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).aBar(); 12619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 12629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mFoo.aByte(); 12639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson verify(mFoo).aByte(); 12649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 12659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1266ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testUnfinishedVerifyCaughtInTearDown_Issue5() { 1267ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo); 1268ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1269ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 1270ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1271ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1272ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1273ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1274ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testUnfinishedWhenCaughtInTearDown_Issue5() { 1275ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doThrow(new RuntimeException()).when(mFoo); 1276ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1277ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson checkForProgrammingErrorsDuringTearDown(); 1278ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1279ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1280ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1281ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1282ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testUnfinishedVerifyCaughtByStartingWhen_Issue5() { 1283ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, never()); 1284ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1285ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo).clear(); 1286ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1287ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1288ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1289ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1290ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testUnfinishedWhenCaughtByStartingVerify_Issue5() { 1291ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doThrow(new RuntimeException()).when(mFoo); 1292ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1293ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo).clear(); 1294ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1295ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1296ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1297ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1298ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testSecondUnfinishedVerifyShouldFailImmediately() throws Exception { 1299ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo); 1300ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1301ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo); 1302ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1303ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1304ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1305ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1306ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testSecondUnfinishedWhenShouldFailImmediately() throws Exception { 1307ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo); 1308ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1309ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo); 1310ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1311ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1312ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1313ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1314ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testVerifyWithTimeout_SuccessCase() throws Exception { 1315ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson CountDownLatch countDownLatch = new CountDownLatch(1); 1316ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson invokeBarMethodAfterLatchAwait(countDownLatch); 1317ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo).aBar(); 1318ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, never()).aBar(); 1319ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson countDownLatch.countDown(); 1320ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(100)).aBar(); 1321ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1322ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1323ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testVerifyWithTimeout_FailureCase() throws Exception { 1324ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson long start = System.currentTimeMillis(); 1325ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1326ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(10)).aBar(); 1327ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1328ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 1329ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson long duration = System.currentTimeMillis() - start; 1330ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson assertTrue(duration > 5); 1331ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1332ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1333ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testVerifyWithTimeoutMultipleInvocations_SuccessCase() throws Exception { 1334ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson CountDownLatch countDownLatch = new CountDownLatch(1); 1335ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson invokeBarMethodAfterLatchAwait(countDownLatch); 1336ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson invokeBarMethodAfterLatchAwait(countDownLatch); 1337ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo).aBar(); 1338ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, never()).aBar(); 1339ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson countDownLatch.countDown(); 1340ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(100).times(2)).aBar(); 1341ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(100).atLeast(2)).aBar(); 1342ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(100).between(2, 4)).aBar(); 1343ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(100).atLeastOnce()).aBar(); 1344ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1345ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1346ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testVerifyWithTimeoutMultipleInvocations_FailureCase() throws Exception { 1347ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson long start = System.currentTimeMillis(); 1348ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aBar(); 1349ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1350ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, timeout(10).between(2, 3)).aBar(); 1351ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1352ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (AssertionError expected) {} 1353ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson long duration = System.currentTimeMillis() - start; 1354ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson assertTrue(duration > 5); 1355ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1356ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1357ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1358ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testConcurrentModificationExceptions() throws Exception { 1359ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson // This test concurrently stubs, verifies, and uses a mock. 1360ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson // It used to totally reproducibly throw a ConcurrentModificationException. 1361ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Future<?> task1 = mExecutorService.submit(new Runnable() { 1362ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson @Override 1363ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void run() { 1364ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson while (!Thread.currentThread().isInterrupted()) { 1365ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aBar(); 1366ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Thread.yield(); 1367ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1368ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1369ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson }); 1370ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Future<?> task2 = mExecutorService.submit(new Runnable() { 1371ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson @Override 1372ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void run() { 1373ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson while (!Thread.currentThread().isInterrupted()) { 1374ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, anyTimes()).aBar(); 1375ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Thread.yield(); 1376ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1377ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1378ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson }); 1379ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Thread.sleep(20); 1380ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson task1.cancel(true); 1381ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson task2.cancel(true); 1382ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1383ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson task1.get(); 1384ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1385ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (CancellationException expected) {} 1386ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1387ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson task2.get(); 1388ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1389ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (CancellationException expected) {} 1390ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1391ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1392ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testCannotVerifyFromSecondThreadAfterStubbingInFirst() throws Exception { 1393ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo).aBar(); 1394ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Future<?> submit = mExecutorService.submit(new Runnable() { 1395ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson @Override 1396ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void run() { 1397ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, anyTimes()).aBar(); 1398ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1399ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson }); 1400ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1401ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson submit.get(); 1402ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1403ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (ExecutionException expected) { 1404ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson assertTrue(expected.getCause() instanceof IllegalStateException); 1405ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1406ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1407ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1408ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void testCannotStubFromSecondThreadAfterVerifyingInFirst() throws Exception { 1409ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mExecutorService.submit(new Runnable() { 1410ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson @Override 1411ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public void run() { 1412ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson verify(mFoo, anyTimes()).aBar(); 1413ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1414ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson }).get(); 1415ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson try { 1416ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson doReturn(null).when(mFoo).aBar(); 1417ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 1418ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } catch (IllegalStateException expected) {} 1419ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1420ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 14212a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson public void testCustomMatcher() { 14222a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson ArgumentMatcher argumentMatcher = new ArgumentMatcher() { 14232a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson @Override 14242a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson public boolean matches(Object value) { 14252a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson return ((String) value).contains("[]"); 14262a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson } 14272a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson }; 14282a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson mFoo.add("as[]df"); 14292a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson mFoo.add("qwer[]asdf"); 14302a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson mFoo.add("1234"); 14312a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson verify(mFoo, times(3)).add(anyString()); 14322a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson verify(mFoo, times(2)).add((String) matches(argumentMatcher)); 14332a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson } 14342a267dd8513e727846c03395429f69e4ab17f1c6Hugo Hudson 143540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson public void testInorderExample_Success() { 143640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 143740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> firstMock = mock(List.class); 143840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 143940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> secondMock = mock(List.class); 144040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("was called first"); 144140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondMock.add("was called second"); 144240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson InOrder inOrder = inOrder(firstMock, secondMock); 144340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("was called first"); 144440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(secondMock).add("was called second"); 144540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 144640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 144740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson public void testInorderExample_Failure() { 144840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 144940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> firstMock = mock(List.class); 145040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 145140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> secondMock = mock(List.class); 145240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("was called first"); 145340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondMock.add("was called second"); 145440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson InOrder inOrder = inOrder(firstMock, secondMock); 145540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(secondMock).add("was called second"); 145640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 145740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("was called first"); 145840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 145940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 146040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 146140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 146240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson public void testInorderInterleave() { 146340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 146440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> firstMock = mock(List.class); 146540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("a"); 146640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("b"); 146740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("a"); 146840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 146940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // Should be fine to verify a then b, since they happened in that order. 147040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson InOrder inOrder = inOrder(firstMock); 147140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 147240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 147340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 147440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // Should also be fine to inorder verify the other way around, they happened in that order too. 147540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder = inOrder(firstMock); 147640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 147740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 147840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 147940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // Should be fine to verify "a, b, a" since that too happened. 148040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder = inOrder(firstMock); 148140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 148240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 148340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 148440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 148540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // "a, a, b" did not happen. 148640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder = inOrder(firstMock); 148740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 148840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 148940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 149040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 149140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 149240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 149340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 149440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // "b, a, b" did not happen. 149540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder = inOrder(firstMock); 149640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 149740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("a"); 149840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 149940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 150040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 150140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 150240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 150340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // "b" did not happen twice. 150440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder = inOrder(firstMock); 150540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 150640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 150740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson inOrder.verify(firstMock).add("b"); 150840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 150940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 151040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 151140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 151240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson public void testInorderComplicatedExample() { 151340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // TODO: I'm currently totally ignoring the parameters passed to the inorder method. 151440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson // I don't understand what the point of them is, anyway. 151540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 151640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> firstMock = mock(List.class); 151740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson @SuppressWarnings("unchecked") 151840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson List<String> secondMock = mock(List.class); 151940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 152040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("1"); 152140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondMock.add("2"); 152240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstMock.add("3"); 152340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondMock.add("4"); 152440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 152540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson InOrder allInOrder = inOrder(firstMock, secondMock); 152640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson allInOrder.verify(firstMock).add("1"); 152740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson allInOrder.verify(secondMock).add("2"); 152840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson allInOrder.verify(firstMock).add("3"); 152940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson allInOrder.verify(secondMock).add("4"); 153040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 153140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson InOrder firstInOrder = inOrder(firstMock, secondMock); 153240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstInOrder.verify(firstMock).add("1"); 153340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstInOrder.verify(firstMock).add("3"); 153440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 153540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstInOrder.verify(secondMock).add("2"); 153640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 153740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 153840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson firstInOrder.verify(secondMock).add("4"); 153940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 154040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson InOrder secondInOrder = inOrder(firstMock, secondMock); 154140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondInOrder.verify(secondMock).add("2"); 154240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondInOrder.verify(secondMock).add("4"); 154340d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 154440d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondInOrder.verify(firstMock).add("1"); 154540d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 154640d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 154740d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson try { 154840d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson secondInOrder.verify(firstMock).add("3"); 154940d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson throw new IllegalStateException(); 155040d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } catch (AssertionError expected) {} 155140d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson } 155240d40a3f2ebf988f36b828157be56cc12c9c70acHugo Hudson 1553ae4e4ac4facc3eacff13ab7ed115292fb5009d1eHugo Hudson public static class Jim { 15544541568ab5ac306c7dc2b648f7908610868180deHugo Hudson public int bob() { 1555ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson fail(); 15564541568ab5ac306c7dc2b648f7908610868180deHugo Hudson return 3; 1557ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1558ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1559ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1560ae4e4ac4facc3eacff13ab7ed115292fb5009d1eHugo Hudson // Does not work on JVM, android only. 15614541568ab5ac306c7dc2b648f7908610868180deHugo Hudson public void testMockingConcreteClasses() throws Exception { 1562ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson Jim mock = mock(Jim.class); 15634541568ab5ac306c7dc2b648f7908610868180deHugo Hudson assertEquals(0, mock.bob()); 15644541568ab5ac306c7dc2b648f7908610868180deHugo Hudson doReturn(8).when(mock).bob(); 15654541568ab5ac306c7dc2b648f7908610868180deHugo Hudson assertEquals(8, mock.bob()); 1566ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1567ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1568ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson private Future<Void> invokeBarMethodAfterLatchAwait(final CountDownLatch countDownLatch) { 1569ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson return mExecutorService.submit(new Callable<Void>() { 1570ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson @Override 1571ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson public Void call() throws Exception { 1572ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson countDownLatch.await(); 1573ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson mFoo.aBar(); 1574ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson return null; 1575ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1576ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson }); 1577ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1578ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1579ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson // TODO(hugohudson): 5. Every method that throws exceptions could be improved by adding 1580ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson // test for the content of the error message. 15819de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 15829de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 5. Make the doReturn() method take variable arguments. 15839de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // The syntax is: 15849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // doReturn(1, 2, 3).when(mFoo).anInt(); 15859de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // And of course means that the method returns 1 the first time, 2, the second and 3 the third. 15869de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Note that this doesn't imply verification, and I presume that the 3 is always returned for 15879de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // the 4th and subsequent times. 15889de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 15899de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 6. Could also offer a nicer syntax for multiple returns like this: 15909de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // How about doReturn().thenThrow().thenReturn().when(mFoo).aDouble(); 15919de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 15929de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 5. Get around to implementing Mockito's when() syntax. 15939de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // I don't really like it, because it means a lot more static nonsense, with yet more 15949de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // opportunities to shoot oneself in the foot. 15959de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Plus, where's the upside in more than one way to do the same thing - it just gets confusing. 15969de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // But, I imagine that plenty of people who are familiar with Mockito will want this, so I 15979de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // probably should do it, plus there's a good argument that it allows typechecking of the 15989de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // method calls, so I guess we probably should. Looks like this: 15999de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.foo(0)).thenReturn(1); 16009de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.foo(1)).thenThrow(new RuntimeException) 16019de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.foo(anyInt())).thenReturn("bar") 16029de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.foo(argThat(isValid()))).thenReturn("element") 16039de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.someMethod("some arg")).thenThrow(new RuntimeException()).thenReturn("foo"); 16049de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.someMethod("some arg")).thenReturn("one", "two", "three"); 16059de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // when(mock.someMethod(anyString())).thenAnswer(new Answer() { 16069de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // @Override 16079de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Object answer(InvocationOnMock invocation) { 16089de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Object[] args = invocation.getArguments(); 16099de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Object mock = invocation.getMock(); 16109de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // return "called with arguments: " + args; 16119de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // } 16129de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // } 16139de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16149de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 6. Again we can chain things like doNothing() then doThrow() I suppose. 16159de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // doNothing().doThrow(new RuntimeException()).when(mock).someVoidMethod(); 16169de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16179de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 6. I really like the idea of implementing the Spy, which is a wrapper on 16189de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // a real object and delegates all calls to that real object, but allows you to intercept 16199de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // the ones that you want to. 16209de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Sounds like it will be particularly good for testing legacy code. 16219de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // But also wouldn't be so much use without us being able to mock concrete classes, which I 16229de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // imagine is not on the cards for a while yet. 16239de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16249de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // TODO(hugohudson): 6. Could possibly look into more aliases for the common methods, so that 16259de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // you can do the 'given... when... assertThat...' pattern as follows: 16269de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // //given 16279de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // given(seller.askForBread()).willReturn(new Bread()); 16289de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // //when 16299de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // Goods goods = shop.buyBread(); 16309de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // //then 16319de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson // assertThat(goods, containBread()); 16329de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 1633ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson // TODO: All unfinished verify and when statements should have sensible error messages telling 1634ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson // you where the unfinished statement comes from. 16359de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16369de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Returns the line number of the line following the method call. */ 16379de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson private int getNextLineNumber() { 16389de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return new Exception().getStackTrace()[1].getLineNumber() + 1; 16399de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16409de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16419de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Returns a string like: "com.google.foo.TestFoo.testMethod(TestFoo:50)" */ 16429de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson private String singleLineStackTrace(int lineNumber) { 16439de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return getClass().getName() + "." + getName() + "(" + getClass().getSimpleName() + 16449de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson ".java:" + lineNumber + ")"; 16459de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16469de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16479de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson /** Simple callable that invokes the callback captured in the callback member variable. */ 16489de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson private class CallCapturedCallbackCallable implements Callable<Object> { 16499de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 16509de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Object call() { 16519de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson mCaptureCallback.getValue().callMeNow(); 16529de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return null; 16539de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16549de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16559de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16569de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson private Foo createNotARealMock() { 16579de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson InvocationHandler handler = new InvocationHandler() { 16589de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 16599de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 16609de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return null; 16619de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16629de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }; 16639de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson Foo notARealMock = (Foo) Proxy.newProxyInstance( 16649de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson getClass().getClassLoader(), new Class<?>[]{ Foo.class }, handler); 16659de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson assertNotNull(notARealMock); 16669de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return notARealMock; 16679de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16689de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson 16699de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson private static Callback createNoOpCallback() { 16709de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson return new Callback() { 16719de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson @Override 16729de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson public void callMeNow() { 16739de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 16749de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson }; 16759de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson } 1676ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson 1677ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson private static <T> List<T> newList(T... things) { 1678ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson ArrayList<T> list = new ArrayList<T>(); 1679ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson for (T thing : things) { 1680ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson list.add(thing); 1681ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 1682ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson return list; 1683ebb9a5e46fa2c58fa091a8de2c12d87828fae2b0Hugo Hudson } 16849de203bcac3d285f4fa57c93085e467eaab9f8f9Hugo Hudson} 1685