带有 java 8 消费者 API 的 Mockito

问题描述 投票:0回答:1

我有以下方法,我需要编写一个测试用例,可以覆盖代码覆盖率中的所有行。

public Consumer<Obj> abc() {
    return obj -> {
        Obj info = new Obj(obj);
        xyz.accept(anotherPrivateMethod(info));
    };
}

我希望我的 Mockito 测试用例调用

Obj info = new Obj(obj)
xyz.accept(anotherPrivateMethod(info))

尝试了以下来自堆栈溢出搜索的代码,但它不起作用。

    Obj o = Mockito.mock(Obj.class);
    String objInfoString = mapper.writeValueAsString(o);
    Mockito.doAnswer(ans -> {
        Consumer<Obj> callback = (Consumer<Obj>) ans.getArgument(1);
        callback.accept(o);
        return null;
    }).when(consumerObj).accept(any());
    Mockito.verify(xyz).accept(objInfoString);

如有任何帮助,我们将不胜感激。

java java-8 mockito
1个回答
0
投票

我看到两个选项:

  1. 以允许测试的方式重构。例如使用标准类:
public class ObjConsumer implements Consumer<Obj> {

  private final Xyz xyz;
  private final Function<Obj, Obj> objFactory;
  private final OtherDependencies od;

  /constructor

  public void accept(Obj obj) {
    Obj info = objFactory.apply(obj);
    xyz.accept(od.doStuff(info));
  }
}

继续为班级编写测试并提供模拟。

  1. 通过模拟对象创建来模拟本地对象。有关如何执行此操作的更多详细信息,请参阅我对 Junit 本地对象模拟 的回答。看看你的 lambda 这不会更容易,可能会更难。我会选择重构选项。
© www.soinside.com 2019 - 2024. All rights reserved.