【问题标题】:mocking/spying private member of super class模拟/监视超级类的私人成员
【发布时间】:2013-07-11 11:36:26
【问题描述】:

我正在编写 junit 测试来测试 BaseClass 方法。该方法使用超类成员。 BaseClass 构造函数调用super(arg1, arg2)。 在 super(arg1, arg2) 构造函数中,有一个依赖注入器设置了一个私有成员 超类的。 当我运行测试时,由于未设置依赖项,因此 super() 正在抛出一个 例外。我只想模拟 super() 中使用依赖注入设置私有成员的语句。 mockito 怎么办?

【问题讨论】:

    标签: mockito stub spy


    【解决方案1】:

    字段注入始终是测试的问题。因此,只要您有选择,请选择构造函数注入。

    你可以启动依赖注入器并让它注入一个模拟而不是一个真正的类。解决方案将取决于您实际使用的 DI 框架(guice、cdi、...) 对于 guice,您可以使用 jukito,例如 cdi Arquillian。但它会减慢测试执行速度并增加测试类的复杂性。

    作为替代方案,您可以在测试类的实例上反映私有字段,只需设置一个模拟。比如:

    instance = new TestObject();
    Field injected = TestObject.class.getDeclaredField("injected");
    injected.setAccessible(true);
    injected.set(instance, mock(InjectedType.class));
    

    TestObject 是您要测试的类,injected 是注入某些东西的私有字段,InjectedType 是该私有字段的类型。

    【讨论】:

    • 感谢@Andreas_D,但问题是超类的私有成员正在其构造函数中设置。所以我的代码本身在这里抛出异常:instance = new TestObject();
    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多