抽象类上的Spring Autowire注释:未定义唯一bean

抽象类上的Spring Autowire注释:未定义唯一bean,spring,annotations,abstract-class,autowired,Spring,Annotations,Abstract Class,Autowired,我有一个抽象类: @Component public abstract class BaseReport { public void export() { ... } 以及一组扩展它并重写export()方法(或不重写)的类 我的大多数测试自动连接扩展BaseReport的具体类,没有任何问题: public class Report1Test extends BaseTest { @Autowired Report1 _report; public class

我有一个抽象类:

@Component
public abstract class BaseReport {

  public void export() {
   ...
}
以及一组扩展它并重写export()方法(或不重写)的类

我的大多数测试自动连接扩展BaseReport的具体类,没有任何问题:

public class Report1Test extends BaseTest {

    @Autowired
    Report1 _report;

public class Report2Test extends BaseTest {

    @Autowired
    Report2 _report;
这适用于扩展BaseReport的所有类的自动关联。但我还需要自动连接抽象类本身BaseReport,以测试export()方法

当我尝试运行它时,我得到了臭名昭著的:

未定义BaseReport类型的唯一bean:应为单个匹配bean,但找到2[Report1,Report2]

我尝试过使用@Qualifier,但@Qualifier的问题是(据我所知),您使用它来告诉Spring您希望使用哪个类——实现接口或扩展抽象类。但那不是我的情况。我想使用抽象类本身

我还尝试使用@Resource,如下所示:

public class BaseReportTest extends BaseTest {

  @Resource(name = "baseReport")
  BaseReport _report;
Spring告诉我没有这个名字的豆子(

我该怎么做


干杯。

抽象类无法实例化,您需要使用具体的实现。 与普通java一样,如果您尝试实例化一个抽象类,它会告诉您在其中实现抽象方法。当您这样做时,将创建一个匿名类。它不是抽象类的一个实例,而是该抽象类的一个新子类

Spring将寻找扩展基类的类,即Report1和Report2, Spring看到它有多个与需求匹配的类,而不知道选择哪一个。因此,您会得到一个错误,即存在多个匹配的bean


您可以通过制作“适配器”来修复此问题基本上,创建一个具体类,该类扩展基类,实现抽象方法,但不执行任何操作。然后,您可以自动连接该实现并对其进行测试。但是,由于您正在测试报表1和报表2,您的抽象类应该已经准备好进行测试。如果基类仍然出现错误,则意味着logi你不使用的c会导致错误,这无论如何都是一种不好的做法。此外,通过测试工具,你可以通过这种方式发现未使用的代码。

你完全正确。在阅读了你的回复后,我又看了一眼,果然,我有点误解了这个问题。所有具体的类都扩展了BaseReport并实现了导出()方法,但export()方法不是来自BaseReport,而是来自IReport接口,BaseReport和所有具体报表都实现了该接口。因此,没有必要测试BaseReport的export()方法,因为它没有!因为我已经测试了每个具体类的export()方法,所以我的工作已经完成。非常感谢您的帮助。
public class BaseReportTest extends BaseTest {

  @Autowired
  BaseReport _report;
public class BaseReportTest extends BaseTest {

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