Тестирование a Spring AOP Aspect
При написании аспектов, как я могу проверить, что они соответствуют, и что они вызываются, когда я хочу их?
Я использую объявления @Aspect
с Spring 2.5.6.
Мне не нужны функциональные возможности, которые были извлечены и протестированы в противном случае.
Ответы
Ответ 1
Я закончил создание чего-то, что является частью теста интеграции, следующим образом:
Создан тест Spring -aware JUnit
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "aspects-test.xml" })
public class SomeAspectTest {
}
Создал конфигурацию spring для этого теста, которая:
- включает использование @AspectJ;
- настраивает мой аспект с помощью фиктивных зависимостей
-
объявляет bean, который должен быть поднят по аспекту
<aop:aspectj-autoproxy />
<bean class="SomeAspect">
<property name="userDetailsSource">
<bean class="StubUserDetailsSource"/>
</property>
</bean>
<bean class="DummyService"/>
В unit test я извлекаю фиктивный сервис и вызывая его методы
@Autowired
private DummyService _dummyService;
@Test(expected = ApplicationSecurityException.class)
public void adminOnlyFails() throws ApplicationSecurityException {
_dummyService.adminOnly();
}
Ответ 2
Здесь три теста:
- Являются ли ваши точечные стрелки соответствующими тому, что вы ожидаете?
- Помогают ли ваши советы правильному pointcut?
- Помогает ли совет, как вы ожидаете?
Чтобы проверить точки, вы можете определить некоторые типы тестов, которые имеют одинаковые сигнатуры пакета/типа/метода в качестве целевых "реальных" целей, а затем определить совет теста против точек, чтобы убедиться, что они сопоставлены (также определите некоторые типы которые не должны быть согласованы, чтобы гарантировать, что точки не слишком либеральны). Обычно я делаю это, определяя совет, чтобы сделать обратный вызов методу в тестовой цели, установив флаг, а затем утвердить, что флаг установлен.
Проверка теста сложнее. Я склонен делегировать все органы консультаций нормальному методу, а затем сосредоточиться на тестировании метода, а не на совете.
Если вы это сделали, единственной недостающей частью является то, что ваш совет применяется к правильным точкам и фактически вызывает методы. Если вы обеспокоены, это может быть проблемой, вы можете сделать это, создав еще один аспект, который соответствует вашему исполнению, и устанавливает флаг, чтобы показать, что ожидаемый делегированный метод был вызван этим аспектом и переопределить метод, чтобы ничего не делать.