我想了解为什么在这种特定情况下@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。
(不考虑属性或字段注入)
我有一个父类,其中包含构造函数注入的依赖项: 如果我从这个类继承,我总是需要重新定义一个调用父构造函数的构造函数吗? 使用 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呢?