doNothing () зарезервировано только для пустых методов.Если ваш метод возвращает что-то, то вы должны сделать то же самое (или выбросить исключение).В зависимости от сложности вашего Account.reserveString () вам может потребоваться смоделировать не только этот вызов одного метода, если результат используется где-то еще.
Попытка использовать doNothing () для не-void метода приводит кошибка:
org.mockito.exceptions.base.MockitoException:
Only void methods can doNothing()!
Example of correct use of doNothing():
doNothing().
doThrow(new RuntimeException())
.when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
Рассмотрим такие классы:
@Component
public class BankDao {
public BankDao() {}
public void createVoid() {
System.out.println("sth - 1");
}
public String createString(){
return "sth - 2";
}
}
@Service
public class Account {
@Autowired
private final BankDao DAO;
public Account(BankDao dao) {
this.DAO = dao;
}
public void reserveVoid() {
System.out.println("before");
DAO.createVoid();
System.out.println("after");
}
public void reserveString() {
System.out.println(DAO.createString());
}
}
Для которых сделан тестовый класс:
@RunWith(MockitoJUnitRunner.class)
public class AccountTest {
@Mock
private BankDao bankDao;
@InjectMocks
private Account account;
@Test
public void reserveVoid_mockBankDaoAndDontUseRealMethod() {
doNothing().when(bankDao).createVoid();
account.reserveVoid();
}
@Test
public void reserveString_mockBankDaoAndDontUseRealMethod() {
when(bankDao.createString()).thenReturn("nothing");
account.reserveString();
}
}
Запуск такого теста даст:
nothing
before
after
Если вы измените @Mock на @Spy и удалите строки с помощью doNothing () и when (), то вы будете вызывать оригинальные методы.Результат будет:
sth - 2
before
sth - 1
after