Я часто работаю с методами, которые принимают обратные вызовы, и обратные вызовы кажутся несколько трудными для тестирования. Давайте рассмотрим следующий сценарий, если есть метод, который принимает обратный вызов с помощью одного метода (для простоты я предполагаю, что метод тестирования является синхронным), следующий шаблонный шаблон может быть написан только для обеспечения вызова метода обратного вызова:Тестирование модуляции Java: самый простой способ проверить, вызван ли обратный вызов
@Test
public void testMethod() {
final boolean[] passed = {false};
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
passed[0] = isSuccessful;
}
});
assertTrue(passed[0]);
}
Это похоже на суррогат. Я хотел бы знать: есть ли более элегантный способ протестировать такой код, чтобы сделать код выше похожим на псевдокод ниже?
@Test
public void testMethod() {
// nothing explicit here, implicit boolean state provided by a test-runner
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
if (isSuccessful) {
pass(); // not sure how it should look like:
// * an inherited method that sets the state to "true"
// * or an object with the pass method
// * whatever
// but doesn't exit testMethod(), just sets the state
}
}
});
// nothing explicit here too:
// test runner might check if the state is changed to true
// otherwise an AssertionError might be thrown at the end of the method implicitly
}
Немного чище. Возможно ли это в JUnit, TestNG или любой другой структуре тестирования? Благодаря!
UPDATE
К сожалению, я, кажется, задал смутный вопрос, который на самом деле не соответствует то, что я хотел спросить. Я в основном имел в виду любой код (не обязательно обратный вызов), который может быть вызван, если определенные условия удовлетворяются только до , чтобы установить состояние результата в значение. Проще говоря, я просто хочу избавиться от начального boolean[] passed
и окончательного assertTrue(passed[0])
, считая, что они являются своего рода прологом и эпилогом соответственно и предполагают, что начальное состояние установлено на false
, поэтому необходимо вызвать pass()
, чтобы установить состояние на true
, Независимо от того, , какpassed[0]
установлен в true
, где бы ни было. Но, к сожалению, я задал этот вопрос, используя контекст обратных вызовов, однако это просто вариант, а не требование. Таким образом, название вопроса не отражает то, что я действительно хотел спросить, но перед обновлением были опубликованы некоторые ответы.
Спасибо за ответ! Да, Mockito - действительно хорошая библиотека. Честно говоря, я не принимал во внимание насмешливые библиотеки: я просто хотел избавиться от суррогатного флага и завершающих утверждений. С помощью Mockito необходимо правильно вызвать 'verify'. Я просто подумал, что последнее утверждение может быть неявным и «поставлено» тестовым бегуном. –
Ну, как я уже сказал, это только знак соответствия; если вы хотите, вы можете заменить аргумент 'true', или даже' ArgumentCaptor '. –
fge
Почему downvote? – fge