有没有办法模拟类的字段

时间:2015-03-17 05:08:01

标签: mockito

这是我的情况,我有一个A类,它有一个成员字段b。我想测试并在单元测试中,我嘲笑A并且还需要调用方法f()来调用b的f()。但是模拟A中的b变量是null,因此会抛出NPE,而我没有b的get / set方法,所以有没有办法模拟b?感谢

public static class B{
    public void f() {

    }
  }

  public static class A {
    B b;

    public void f() {
      b.f();
    }
  }

1 个答案:

答案 0 :(得分:0)

如果你想在测试中模拟A的b属性,你已经给了b属性默认(包私有)访问权限,所以只要你的测试在相同的包你可以直接替换b属性。

@Test
public void testB() {
    A underTest = new A();
    B mockedB = Mockito.mock(B.class);
    underTest.b = mockedB;

    underTest.f();

    Mockito.verify(mockedB).f();
}

顺便说一下,我个人不喜欢使用包私有访问来使用成员属性进行测试,而是建议使用像GuiceSpring DI这样的依赖注入框架来进行构造函数注入。

但是你已经描述过你已经嘲笑了A,我已经想过如果是这种情况,A的f()方法什么都不做 - 你不会得到一个空指针异常作为调用mock将替换真正的b属性,只是一个无效的void方法。如果是这种情况,请您提供更多详细信息吗?