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

Адаптер и Мост, конечно, связаны, и различие является тонким. Вероятно, что некоторые люди, которые думают, что используют один из этих шаблонов, на самом деле используют другой шаблон.

объяснение, которое я видел, состоит в том, что Адаптер используется, когда Вы пытаетесь объединить интерфейсы некоторых несовместимых классов, которые уже существуют . Адаптер функционирует как своего рода переводчик к реализациям, которые можно было рассмотреть наследие .

принимая во внимание, что Шаблон "мост" используется для кода, который, более вероятно, будет greenfield. Вы разрабатываете Мост для обеспечения абстрактного интерфейса для реализации, которая должна варьироваться, но Вы также определяете интерфейс тех классов реализации.

Драйверы устройств являются часто процитированным примером Моста, но я сказал бы, что это - Мост, если Вы определяете интерфейсную спецификацию для поставщиков устройства, но это - Адаптер, если Вы берете существующие драйверы устройств и делаете класс обертки для обеспечения объединенного интерфейса.

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

См. также http://c2.com/cgi/wiki?BridgePattern

12
задан cb4 11 November 2016 в 22:08
поделиться

2 ответа

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

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

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

}

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

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

     
    
     
     
     
    
    
    

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

@Autowired
private DummyService _dummyService;

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

    _dummyService.adminOnly();
}
7
ответ дан 2 December 2019 в 20:41
поделиться

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

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

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

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

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

8
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: