Mockito - 在构造函数中模拟方法调用

时间:2016-05-31 11:00:45

标签: java unit-testing mockito

我有一个班级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的新实例。

我该如何解决这个问题?任何意见都表示赞赏。

2 个答案:

答案 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);
}

如果这样可行,那么您已经验证了您的疑虑,并可以继续进行测试。