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