我有一个班级X
,其中包含YBuilder
并构建Y
的实例
public class X {
private Y y;
public X(YBuilder builder) throws IOException{
y = builder.build();
}
}
我需要模拟对Y
的所有调用,所以我写了这样的单元测试:
@Mock
private Y Y;
@Mock
private YBuilder builder;
@InjectMocks
private X x;
@Before
public void setup() {
when(builder.build()).thenReturn(y); // this does not work
}
我在主类中得到Null Pointer Exception
,因为依赖项Y
尚未被模拟。
我认为这是因为@InjectMocks
在我能够模拟呼叫之前实例化X
的新实例。
我该如何解决这个问题?任何意见都表示赞赏。
答案 0 :(得分:1)
是的,好的 - 这里的问题是在X
的构造函数中调用代码when(builder.build()).thenReturn(y)
,然后才设置.build()
。
你能控制X级吗?如果是,您是否能够在X中存储对构建器的引用,并稍后调用public class X {
private YBuilder builder;
public X(YBuilder builder) {
this.builder = builder;
}
}
?
setup()
否则,在user_favourite
方法中手动初始化模拟可能是最直接的。
答案 1 :(得分:0)
如果您认为某些事情正在发生,那么请使用代码进行证明。您可以删除观察到的行为并自己构建X
:
@Before
public void setup() {
when(builder.build()).thenReturn(y); // this does not work
x = new X(builder);
}
如果这样可行,那么您已经验证了您的疑虑,并可以继续进行测试。