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

当我组合构造函数注入(子类)和属性注入(父类)时,@InjectMocks给我null

西门鹏程
2023-03-14

我想了解为什么在这种特定情况下@InjectMocks不知道从抽象类中注入属性。有谁能帮我弄明白吗?多谢!!!

如果子类和父类都使用属性注入,那么我的单元测试工作没有问题。

public abstract class AbstractClass
{
  @Inject
  private D d;
  ...  
}

@RequestScoped
public class ConcreteClass extends AbstractClass
{ 
  private A a;
  private B b;
  private C c;

  @Inject
  public ConcreteClass(A a, B b, C c)
  {
    this.a = a;
    this.b = b;
    this.c = c;
  }

  /**
   * CDI, no arguments constructor.
   */
  public ConcreteClass()
  {
    // CDI constructor
  }
}

@RunWith(Theories.class)
public class ConcreteClassTest
{
  @Mock
  D d;

  @Mock
  A a; 

  @InjectMocks
  ConcreteClass concreteClass;  

 @Before
  public void setUp() throws Exception
  {
   ...
    MockProvider.setMockForClass(A.class, a);
    MockProvider.setMockForClass(D.class, d);
    ...
  }   

  @Theory
  public void testMethod()     
  {
    ...
    concreteClass.methodXXX();
    //here if i inspect the concreteClass i see that the attribute "a" has    value and attribute "d" is null.
    ...
  }  

}

共有1个答案

邵正雅
2023-03-14

摘自mockito文档:
https://static.javadoc.io/org.mockito/mockito-core/3.0.0/org/mockito/injectmocks.html

构造函数注入;选择最大的构造函数,然后使用仅在测试中声明的模拟来解析参数。如果使用构造函数成功创建了对象,那么Mockito就不会尝试其他策略。Mockito已经决定,如果对象具有参数化构造函数,则不损坏该对象。

由于您的构造函数只有A、B、C,mockito不考虑D。
(不考虑属性或字段注入)

 类似资料:
  • 我有一个父类,其中包含构造函数注入的依赖项: 如果我从这个类继承,我总是需要重新定义一个调用父构造函数的构造函数吗? 使用 setter 注入,我似乎能够将依赖项保留在父类中,而不需要在子类中重新连接它,如果子类不接触链接到依赖项的功能,这对我来说听起来不错: 看起来,如果我想避免重复自动装配代码和处理子组件中的依赖关系,我只能使用setter或field injection来实现。 是否有更简洁

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 大家好,overflow社区,我正在努力解决Lombok的继承问题。我试图在子类上添加注释和,以便使用父lombok构造函数,但出现了错误“复制方法child()”。 父类: 儿童班: 错误消息: 重复方法Java类型中的孩子()(67109219) 感谢@rentox98的回复,我知道我的子类上的ArgsConstructor总是空的,这会导致两个相同的构造函数。 有没有Lombok方法可以基于

  • 我把下面的内容看做是构造函数和setter注入的区别之一。有人能用一些简单的例子解释一下下面的区别吗,我对术语完全功能对象和不完全对象有点困惑。 -

  • 我是Spring框架的新手。我试图用注入方法(Setter和构造函数)注入依赖关系。我期待在 setter 注入中定义的输出,因为它被构造函数注入覆盖。但是,我收到了如下错误消息 Bean创建异常:未找到默认构造函数 如果我们同时应用两种注入方法,会不会出错?

  • 大家都知道@Autowired(@Inject etc)注释是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired注释的字段和setter,但构造函数呢?这是bean后处理器,这意味着它是在已经创建bean之后调用的,但是构造函数也可以标记为@Autowired,那么如何创建这样的bean呢?