当前位置: 首页 > 知识库问答 >
问题:

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

白昊乾
2023-03-14
@Component
public abstract class BaseReport {

  public void export() {
   ...
}
@Component
public final class Report1 extends BaseReport

@Component
public final class Report2 extends BaseReport

我的大多数测试都是在扩展BaseReport的具体类上进行的,没有任何问题:

public class Report1Test extends BaseTest {

    @Autowired
    Report1 _report;

public class Report2Test extends BaseTest {

    @Autowired
    Report2 _report;

这适用于所有扩展baseReport的类的autowiring。但是我还需要autowire抽象类本身BaseReport,以测试export()方法。

public class BaseReportTest extends BaseTest {

  @Autowired
  BaseReport _report;

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

public class BaseReportTest extends BaseTest {

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

干杯。

共有1个答案

子车桐
2023-03-14

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

Spring会寻找扩展基类的类,即Report1和Report2,但Spring发现它有多个符合需求的类,因此不知道该选择哪一个。因此,您得到的错误是有多个匹配bean。

您可以通过使“适配器”基本创建一个具体类来解决这个问题,该类扩展了您的基类,实现了抽象方法,但不做任何事情。然后,您可以对该实现进行autowire并对其进行测试。但是,您的抽象类应该完全就绪,因为您正在测试报告1和报告2。如果您的基类仍然出现错误,这意味着您不使用的逻辑正在导致bug,这无论如何都是一种糟糕的做法。另外,通过测试coveage工具,您可以以这种方式发现未使用的代码。

 类似资料:
  • 问题内容: 我有一个非常简单的抽象类 现在您可以看到,我正在尝试自动连接DatabaseModel。但是在我的扩展类中,我只为dbModel接收null。 问题:我在这里尝试一些不可能的事情吗? 问题答案: 您的设置似乎很好。原因也许在其他地方。也许您正在使用实例化该类,而不是让spring这样做。

  • 我能以某种方式将一组注释分组到一个抽象类上,并且每个扩展该类的类都自动分配了这些注释吗? 至少以下内容不起作用:

  • 我有这样一个类,它从application.properties获取配置,以创建连接到数据库的驱动程序(im使用jdbc连接到我的数据库): 我还有一个名为JdbcDao的抽象类来创建连接到数据库所必需的所有工具: 然后,我有了那个jdbc抽象类的具体表示: 但是当我做新的JdbcUserDao()时,我有一个NPE,因为应用程序上下文没有被注入,这会在尝试获取自定义bean时导致一个空指针。 堆

  • 我试图创建自定义注释来检查唯一的字段值。例如,检查唯一的电子邮件地址等。 但无法自动关联“customerDAO”对象。它抛出异常组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套的异常是javax。验证。ValidationException:isValid调用期间发生意外异常。 我在哪里犯错?请建议。 顾客JAVA 唯一的JA

  • 可以模拟抽象类,也可以使用Mockito注释将模拟类注入抽象类。我现在有以下情况: 我想在AbstractClassUnderTest上使用类似@InjectMocks的东西,但它不能与@Mock结合使用。Powermock的Whitebox的当前情况是有效的,但我很好奇是否可以通过注释来解决它。我找不到任何解决方案或示例。 (我知道对测试抽象类的反对意见,我个人更愿意测试一个具体的实现,只使用@

  • 我有以下课程: 为什么我无法在抽象类(< code>Parent)的实例上调用< code>toBuilder(),如下面的代码所示?