我有一个带有注入属性的摘要。这由一个子类扩展,其中注入是通过构造函数完成的。在单元测试中,@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 传递给超类。