При написании аспектов, как я могу проверить, что они соответствуют друг другу и что они вызываются, когда я этого хочу?
Я использую декларации @Aspect
в Spring 2.5.6.
Меня не волнует функциональность, которая'извлекается и тестируется иначе.
Здесь нужно проверить три разных вещи:
Чтобы проверить указатели, вы можете определить несколько тестовых типов, которые имеют те же сигнатуры пакетов/типов/методов, что и предполагаемые "реальные" цели, затем определить тестовый совет против указателей, чтобы убедиться, что они совпадают (также определите несколько типов, которые не должны совпадать, чтобы убедиться, что указатели не слишком либеральны). Обычно я делаю это, определяя совет для выполнения обратного вызова метода в тестовой цели, устанавливая флаг, а затем утверждая, что флаг был установлен.
Проверить совет сложнее. Я обычно делегирую все тело совета обычному методу, а затем сосредотачиваюсь на тестировании метода, а не совета.
Если вы сделали это, то единственная недостающая часть - это то, что ваш совет применяется к правильным точкам и действительно вызывает методы. Если вы обеспокоены тем, что это может быть проблемой, вы можете сделать это, создав другой аспект, который соответствует выполнению вашего совета и устанавливает флаг, чтобы показать, что ожидаемый делегированный метод был вызван аспектом, и переопределить метод, чтобы он ничего не делал.
В итоге я создал нечто, что является своего рода интеграционным тестом, следующим образом:
Создал JUnit-тест с поддержкой Spring
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "aspects-test.xml" })
public class SomeAspectTest {
}
Создана конфигурация Spring для этого теста, которая:
включает использование @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();
}