我正在处理设计情况,我不知道如何解决它,或者我的微观设计是否有任何问题。
public abstract class A implements SomeFrameworkInterface {
private final Param1 a1;
@Inject
private Param2 a2;
protected A(Param1 a1) {
this.a1 = a1;
}
@Override
public someFrameworkInterfaceMethod() {
//code
doMyStuff();
}
protected abstract void doMyStuff();
}
@Named
@SomeCustomAnnotation(property="someProperty")
public class B extends A {
@Inject
public B(Param1 b1) { //b1 is different for every implementation of class A, through some annotations
super(b1);
}
@Override
protected void doMyStuff() {
//code
}
}
限制如下:
答案 0 :(得分:0)
在不经过B的情况下,不可能将任何参数传递给A的构造函数,因为实际上是在构造B的实例。只有委托构造函数才能构造B实例的“A部分”。
你能做的最多就是将某种“无类型”参数传递给B的构造函数,这样至少B不会知道Param2
,但这种治疗方法听起来已经比疾病更糟糕了写下来......
我没有看到在构建后注入Param2
使代码变得不那么可测试。 OTOH,使用静态场肯定会这样做。
答案 1 :(得分:0)
我找到了测试它的解决方案,但它看起来有点奇怪。我的意思是我不明白为什么或如何发生这种情况,但它以干净的方式完成工作。 测试类看起来像:
@RunWith(MockitoJUnitRunner.class)
public BTest {
@Mock
private Param1 mockParam1;
@Mock
private Param2 mockParam2;
@InjectedMocks
private A b = new B(null);
@Test
public someFrameworkInterfaceMethodTest() {
when(...).thenReturn(...)
b.someFrameworkInterfaceMethod();
verify(...).someCall(any());
}
}
我很难弄明白为什么 Param1 a1 仍然为空,并试图找出不同的解决方案。但似乎Mockito在构造后再次注入字段(在调用“new B(null)”之后 - 如果字段为null或不确定)。 Param2 a2 被mockito嘲笑,而 Param1 a1 仍然为空,这是因为 Param1 a1上的“最终”关键字 in B class 。