2013-04-12 3 views
8

У меня есть абстрактный класс:Spring Autowire Аннотация на абстрактный класс: Нет уникальный боб не определен

@Component 
public abstract class BaseReport { 

    public void export() { 
    ... 
} 

и куча классов, которые расширяют его, и переопределить метод экспорта() (или нет) ,

@Component 
public final class Report1 extends BaseReport 

@Component 
public final class Report2 extends BaseReport 

Большинство моих тестов autowire конкретные классы, которые расширяют BaseReport, без проблем:

public class Report1Test extends BaseTest { 

    @Autowired 
    Report1 _report; 

public class Report2Test extends BaseTest { 

    @Autowired 
    Report2 _report; 

Это прекрасно работает для автоматического связывания всех классов, которые простираются BaseReport. Но мне также необходимо автообновить абстрактный класс BaseReport, чтобы протестировать метод export().

public class BaseReportTest extends BaseTest { 

    @Autowired 
    BaseReport _report; 

Когда я пытаюсь запустить его я получаю печально:

Нет Уникальный боб типа BaseReport не определен: ожидаемый единственный соответствующий компонент, но нашел 2 [Report1, Report2].

Я попытался использовать @Qualifier, но проблема с @Qualifier заключается в том, что (как я понимаю) вы используете его, чтобы сообщить Spring, какой класс - реализует интерфейс или расширяет абстрактный класс - вы хотите использовать , Но это не мое дело. Я хочу использовать абстрактный класс.

Я также попытался с помощью @Resource, как это:

public class BaseReportTest extends BaseTest { 

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

Spring говорит мне, что нет боба с этим именем. :(

Как я могу это сделать?

Приветствия.

ответ

13

абстрактные классы не могут быть созданы, вам нужно использовать конкретную реализацию. же, как в обычном Java, если вы пытаетесь создать экземпляр абстрактного класса, он предлагает вам реализовать абстрактные методы внутри. Когда вы это делаете, создается анонимный класс. Это не статичность абстрактного класса, а новый подкласс этого абстрактного класса.

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

Вы можете исправить это, создав «адаптер», чтобы создать конкретный класс, который расширяет базовый класс, реализует абстрактные методы, но ничего не делает. Затем вы можете автоустановить эту реализацию и протестировать ее. Однако ваш абстрактный класс должен быть уже протестирован из-за того, что вы тестируете отчет 1 и 2. Если ошибки все еще происходят с вашим базовым классом, это означает, что логика, которую вы не используете, вызывает ошибки, что в любом случае является плохой практикой. также с помощью инструмента для тестовой обработки вы можете обнаружить неиспользуемый код таким образом.

+0

Вы абсолютно правы. Прочитав ваш ответ, я сделал еще один взгляд и уверен, я немного неправильно понял проблему. Все конкретные классы расширяют BaseReport и реализуют метод export(), но * метод export() не исходит из BaseReport, а скорее интерфейс IReport, который реализует BaseReport и все конкретные отчеты. Так что нет необходимости тестировать метод export() BaseReport, потому что у него его нет! Поскольку я уже протестировал каждый конкретный класс 'export() метод, моя работа выполнена. Большое спасибо за помощь. –

Смежные вопросы