2009-08-09 14 views
10

Czy podczas pisania aspektów, czy mogę przetestować, że pasują i że są one wywoływane, kiedy chcę?Testowanie Spring AOP Aspekt

Używam deklaracji @Aspect ze sprężyną 2.5.6.


Nie obchodzi mnie funkcjonalność, która została wyodrębniona i przetestowana w inny sposób.

Odpowiedz

7

skończyło się tworząc coś, co jest trochę testu integracyjnego, w następujący sposób:

Created test JUnit wiosenno-świadomy

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

} 

stworzył konfigurację sprężyn dla tego testu, który:

  • włącza użycie @AspectJ;
  • konfiguruje mój aspekt z manekina zależności
  • deklaruje fasoli, które powinny być podejmowane przez aspekcie

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

W badanej jednostki odzyskać usługę atrapę i wywołać jego metody

@Autowired 
private DummyService _dummyService; 

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

    _dummyService.adminOnly(); 
} 
+0

Czy możesz podać więcej szczegółów? – Javatar

+2

Wydaje mi się, że normalne jest tworzenie testu pół-integracji, gdy tyle logiki jest faktycznie generowanych przez środowisko wykonawcze. – Gepsens

+0

Wywołujesz metodę, która powinna wywoływać metody aspektu, ale nigdy nie odpowiedziałeś, jak sprawdzić, czy metody aspektu są wywoływane. @Javatar Myślę, że to szczegół, którego szukasz? Zgaduję, że Twój przykładowy aspekt zawsze generuje wyjątek ApplicationSecurityException? A co z prawidłową inwokacją metody? – Jorge

8

Są trzy różne rzeczy do testowania tutaj:

  1. Czy Twoje punkty przekroju dopasowania czego można się spodziewać?
  2. Czy Twoja rada odnosi się do właściwego cięcia punktowego?
  3. Czy porady są zgodne z oczekiwaniami?

Aby przetestować punkty, można zdefiniować niektóre typy testów, które mają ten sam podpis pakietu/typu/metody, co zamierzone "rzeczywiste" cele, a następnie zdefiniować poradę testową względem punktów wskazujących, aby upewnić się, że są one dopasowane (również zdefiniuj niektóre typy, które nie powinny być dopasowane, aby zapewnić, że punkty nie są zbyt liberalne). Zwykle robię to, definiując porady dotyczące wywołania zwrotnego do metody w celu testowym, ustawienia flagi, a następnie stwierdzenia, że ​​flaga została ustawiona.

Aby przetestować tę poradę, jest trudniejsze. Mam tendencję do delegowania całego ciała doradczego do normalnej metody, a następnie skupienia się na testowaniu metody zamiast porady.

Jeśli to zrobiłeś, jedyną brakującą częścią jest to, że twoja rada jest stosowana do odpowiednich wskazówek i faktycznie wywołuje metody. Jeśli uważasz, że może to być problem, możesz to zrobić, tworząc inny aspekt, który pasuje do wykonania porady i ustawia flagę, aby pokazać oczekiwaną metodę delegowaną, która została wywołana przez aspekt, i zastąpić tę metodę, aby nic nie robić.

Powiązane problemy