2013-04-12 11 views
8

Mam abstrakcyjną klasę:Wiosna Autowire Adnotacja na klasy abstrakcyjnej: No wyjątkowy fasola jest zdefiniowana

@Component 
public abstract class BaseReport { 

    public void export() { 
    ... 
} 

i kilka klas, które go rozszerzać i zastąpić metodę export() (lub nie) .

@Component 
public final class Report1 extends BaseReport 

@Component 
public final class Report2 extends BaseReport 

Większość moich testów autowire konkretnych klas, które rozszerzają BaseReport, bez żadnych problemów:

public class Report1Test extends BaseTest { 

    @Autowired 
    Report1 _report; 

public class Report2Test extends BaseTest { 

    @Autowired 
    Report2 _report; 

Działa to dobrze dla autowiring wszystkich klas, które rozciągają BaseReport. Ale muszę również wyposażyć samą klasę abstrakcyjną, BaseReport, w testowanie metody export().

public class BaseReportTest extends BaseTest { 

    @Autowired 
    BaseReport _report; 

Gdy próbuję uruchomić go otrzymuję niesławny:

No wyjątkowy fasoli typu BaseReport jest zdefiniowana: oczekiwany jeden pasujący fasoli, ale okazało 2 [raportu1, sprawozdania2].

Próbowałem używać @Qualifier, ale problem z @Qualifier jest taki, że (jak rozumiem) używasz go, aby powiedzieć Spring, która klasa - która implementuje interfejs lub rozszerza klasę Abstract - chcesz użyć . Ale to nie jest moja sprawa. Chcę użyć samej klasy abstrakcyjnej.

Próbowałem też za pomocą @Resource, tak:

public class BaseReportTest extends BaseTest { 

    @Resource(name = "baseReport") 
    BaseReport _report; 

Wiosna mówi mi, nie ma fasoli o tej nazwie. :(

Jak mogę to zrobić?

Cheers.

Odpowiedz

13

abstrakcyjne klasy nie może być instancja, trzeba użyć konkretną realizację. samo jak w zwykłej Javie, jeśli spróbujesz instancję Klasa abstrakcyjna, mówi o zaimplementowaniu metod abstrakcyjnych wewnątrz. Gdy to zrobisz, tworzona jest klasa anonimowa Nie jest to instatiacja klasy abstrakcyjnej, ale nowa podklasa tej klasy abstrakcyjnej. klasy rozszerzające klasę podstawową: Report1 i Report2, Spring widzi, że ma wiele klas, które pasują do wymagań i nie wie, który z nich wybrać. w ten sposób pojawia się błąd, że istnieje wiele pasujących elementów bean.

Możesz to naprawić, sprawiając, że "adapter" tworzy w sposób podstawowy konkretną klasę, która rozszerza twoją klasę bazową, implementuje metody abstrakcyjne, ale niczego nie robi. Następnie możesz wyposażyć tę implementację i przetestować ją. Jednak twoja klasa abstrakcyjna powinna już być przetestowana z uwagi na to, że testujesz raport 1 i 2. Jeśli nadal występują błędy w twojej klasie bazowej, oznacza to, że logika, której nie używasz, powoduje błędy, co i tak jest złą praktyką. również za pomocą narzędzia do sprawdzenia, które można znaleźć w ten sposób.

+0

Masz całkowitą rację. Po przeczytaniu odpowiedzi, spojrzałem jeszcze raz i na pewno, trochę źle zrozumiałem problem. Wszystkie konkretne klasy rozszerzają BaseReport i implementują metodę export(), * ale * metoda export() nie pochodzi z BaseReport, ale raczej z interfejsu IReport, który implementuje BaseReport i wszystkie konkretne raporty. Nie ma potrzeby testowania metody export() BaseReport, ponieważ jej nie ma! Ponieważ testowałem już każdą metodę "export()" dla konkretnej klasy, moja praca została zakończona. Wielkie dzięki za pomoc. –

Powiązane problemy