模拟一个操纵被测单元的私有字段的闭包

时间:2017-08-25 14:44:14

标签: java unit-testing junit mockito

我的测试单元中有以下代码:

someDependency.doSomething(element -> {
    privateFieldOfUnitUnderTest += element;
});

一些依赖项(我用mockito嘲笑)使用lambda函数回调调用方法doSomething(在实际代码中它正在做一些异步调用),该函数回调修改被测单元的私有字段。 我的问题是如何使用mockito正确测试(并且不使用powermocking技术)。

我希望模拟方法doSomething使用单元测试提供的一些数据来调用回调。

3 个答案:

答案 0 :(得分:2)

如果您模仿someDependency,那么doSomething()可以控制的是传递和返回的数据。错过了doSomething()的实施。这意味着在doSomething()内不会触发给定的功能接口。这意味着即使您可以控制element,也不会涉及它。

我看到下一个可能的解决方案:

  • someDependency
  • 的间谍合作
  • 致电真实doSomething()
  • someDependency.getElement()可以在您的测试中嘲笑
  • doSomething()应该重新设计以使用getElement()

答案 1 :(得分:0)

尝试:

Mockito
  .doAnswer(i -> privateFieldOfUnitUnderTest += i.getArgument(0, Integer.class))
  .when(someDependency).doSomething(Matchers.any());

我没有测试它,但应该按预期工作。

答案 2 :(得分:0)

UnitTest验证被测代码(剪切)的公共可观察行为

如果您帖子中剪切的代码是该剪辑的一部分,那么您必须验证使用预期参数调用方法someDependency.doSomething()

// prepare mocks for dependencies
// prepare cut
// execute tested public method in cut
verify(dependency).doSomething(EXPECTED_SUM_OF_ELEMENT_AND_PRIVATE_PROPERTY_VALUE);