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



我有一个带有注入属性的摘要。这由一个子类扩展,其中注入是通过构造函数完成的。在单元测试中,@InjectMocks为抽象类中注入的属性提供 null。

请参阅下面的代码。

我想了解为什么在这种特定情况下,@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.
    ...
  }  
}

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

构造函数

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

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

您可以更改构造函数,使其具有所有 4 个值并将 D 传递给超类。

最新更新