Игнорирование не пустого метода внутри метода тестирования в Mockito - PullRequest
0 голосов
/ 22 ноября 2018

В классе Account у меня есть метод public Account reserveA(), который я хочу протестировать, внутри reserveA он называется методом public Bank DAO.createB().Есть ли способ вызвать reserveA() в тестовом методе, но игнорировать вызов DAO.createB()?Ни один из этих методов не имеет силы.Я попытался:

doNothing().when(Account).reserveA(param1, param2);

, но это не правильный путь.

1 Ответ

0 голосов
/ 22 ноября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...