Тестирование аспекта Spring AOP

При написании аспектов, как я могу проверить, что они соответствуют друг другу и что они вызываются, когда я этого хочу?

Я использую декларации @Aspect в Spring 2.5.6.


Меня не волнует функциональность, которая'извлекается и тестируется иначе.

Здесь нужно проверить три разных вещи:

  1. Соответствуют ли ваши указатели тому, что вы ожидаете?
  2. Ссылается ли ваш совет на правильный указатель?
  3. Выполняется ли совет так, как вы ожидаете?

Чтобы проверить указатели, вы можете определить несколько тестовых типов, которые имеют те же сигнатуры пакетов/типов/методов, что и предполагаемые "реальные" цели, затем определить тестовый совет против указателей, чтобы убедиться, что они совпадают (также определите несколько типов, которые не должны совпадать, чтобы убедиться, что указатели не слишком либеральны). Обычно я делаю это, определяя совет для выполнения обратного вызова метода в тестовой цели, устанавливая флаг, а затем утверждая, что флаг был установлен.

Проверить совет сложнее. Я обычно делегирую все тело совета обычному методу, а затем сосредотачиваюсь на тестировании метода, а не совета.

Если вы сделали это, то единственная недостающая часть - это то, что ваш совет применяется к правильным точкам и действительно вызывает методы. Если вы обеспокоены тем, что это может быть проблемой, вы можете сделать это, создав другой аспект, который соответствует выполнению вашего совета и устанавливает флаг, чтобы показать, что ожидаемый делегированный метод был вызван аспектом, и переопределить метод, чтобы он ничего не делал.

Комментарии (0)
Решение

В итоге я создал нечто, что является своего рода интеграционным тестом, следующим образом:

Создал JUnit-тест с поддержкой Spring

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "aspects-test.xml" })
public class SomeAspectTest {

}

Создана конфигурация Spring для этого теста, которая:

  • включает использование @AspectJ;
  • конфигурирует мой аспект с фиктивными зависимостями
  • объявляет боб, который должен быть подхвачен аспектом

В модульном тесте я получаю фиктивный сервис и вызываю его методы

@Autowired
private DummyService _dummyService;

@Test(expected = ApplicationSecurityException.class)
public void adminOnlyFails() throws ApplicationSecurityException {

    _dummyService.adminOnly();
}
Комментарии (4)