| Direct invocations on [mocks] should be avoided in tests. | |
| When you call a method on a mock, the call normally does only what you have | |
| configured it to do (through calls to `when(...).thenReturn/thenAnswer`, etc.) | |
| and makes a record of the call that can be read by later `verify(...)` calls. | |
| Both of these are rarely what you want: | |
| - The reason to configure a mock's behavior is so that the code under test | |
| will react to that behavior. If you want for the test itself to do | |
| something, then do it directly instead of by calling a method on the mock. | |
| - If a future reader of your test sees a call to `verify(foo).bar()`, then the | |
| reader will expect the test to succeed only because the code under test | |
| called `bar()`, not because the test itself did. | |
| Sometimes, test authors, especially those familiar with other mocking frameworks | |
| (like EasyMock), will call a method on a mock for one of two reasons: | |
| 1. By default, EasyMock requires the test setup to call every method that the | |
| code under test will call. Mockito's defaults do *not* require this. | |
| 2. Many EasyMock tests choose to have EasyMock require that the code under test | |
| call *all* the methods that the test setup calls. Mockito tests that want to | |
| verify calls to methods must verify each call individually. To check that | |
| any particular method has been called, a Mockito test must call | |
| `verify(foo).bar()`, and it must do so *after* the code under test has run. | |
| ```java | |
| @Test | |
| public void balanceIsChecked() { | |
| Account account = mock(Account.class); | |
| LoanChecker loanChecker = new LoanChecker(account); | |
| assertThat(loanChecker.checkEligibility()).isFalse(); | |
| // Should be verify(account).checkBalance();, or be removed if the call to | |
| // `checkEligibility` is sufficient proof the code is behaving as intended. | |
| account.checkBalance(); | |
| } | |
| ``` | |
| There is at least one edge case in which a call to a mock has different effects: | |
| A call to a `final` method will normally *not* be intercepted by Mockito, so it | |
| will run the implementation of that method in the code under test. Sometimes, | |
| that method will call other methods on the mock object, producing effects | |
| similar to if the test had called those methods directly. Sometimes, the method | |
| will have other effects. Both kinds of effects can be confusing, so prefer to | |
| avoid such calls when possible. | |
| [mocks]: https://site.mockito.org/ |