Тестирование 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?
  • Помогает ли совет, как вы ожидаете?

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

Проверка теста сложнее. Я склонен делегировать все органы консультаций нормальному методу, а затем сосредоточиться на тестировании метода, а не на совете.

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