Тестирование аспекта Spring AOP - PullRequest
12 голосов
/ 09 августа 2009

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

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


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

Ответы [ 2 ]

8 голосов
/ 09 августа 2009

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

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

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

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

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

7 голосов
/ 18 октября 2009

Я закончил тем, что создал что-то вроде интеграционного теста, следующим образом:

Создан тест Spring-based JUnit

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

}

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

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

    <aop:aspectj-autoproxy />
    <bean class="SomeAspect">
        <property name="userDetailsSource">
                <bean class="StubUserDetailsSource"/>
        </property>
    </bean>
    <bean class="DummyService"/>
    

В модульном тесте я извлекаю фиктивную службу и вызываю ее методы

@Autowired
private DummyService _dummyService;

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

    _dummyService.adminOnly();
}
...