gpt4 book ai didi

java - 模拟调用的相同答案 10 次,然后是另一个答案,使用 Mockito

转载 作者:行者123 更新时间:2023-11-30 06:52:07 26 4
gpt4 key购买 nike

我希望我的 mock 在被调用 10 次时返回 method1() 并在之后调用时返回 method2()。下面的代码使用匿名内部类。在 Java 8 中有一种优雅的方法可以做到这一点吗?

when(mock.doSomething()).thenAnswer(
new Answer<Account>() {
private int count = 0;

@Override
public Account answer(InvocationOnMock invocationOnMock) throws Throwable {
if (count < 10) {
count++;
return method1();
}
return method2();
}
}
);

最佳答案

由于像计数器这样的可变状态和 Java 8 的 lambda 表达式不能很好地协同工作,所以没有直接的、Java 8 特定的计数器解决方案。并且每一次寻找巧妙解决方法的尝试都将比下面的无计数器解决方案更糟糕

public static <T> OngoingStubbing<T> switchAfter(
OngoingStubbing<T> stub, int calls, Supplier<T> first, Supplier<T> then) {
Answer<T> a1=x -> first.get(), a2=x -> then.get();
while(calls-->0) stub=stub.then(a1);
return stub.then(a2);
}

这相当于使用

Mockito.when(mock.doSomething()).then(x -> method1()).then(x -> method1())
.then(x -> method1()).then(x -> method1()).then(x -> method1()).then(x -> method1())
.then(x -> method1()).then(x -> method1()).then(x -> method1()).then(x -> method1())
.then(x -> method2());

用作

switchAfter(Mockito.when(mock.doSomething()), 10, () -> method1(), () -> method2());

再想一想,有一个解决方案不是代码更简单,但如果第一次调用的次数很大,则更可取:

public static <T> Answer<T> switchAfter(int calls, Supplier<T> first, Supplier<T> then) {
Iterator<T> it=Stream.concat(
IntStream.range(0, calls).mapToObj(i -> first.get()),
Stream.generate(then))
.iterator();
return x -> it.next();
}

可用作

Mockito.when(mock.doSomething()).then(switchAfter(10, () -> method1(), () -> method2()));

关于java - 模拟调用的相同答案 10 次,然后是另一个答案,使用 Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39519741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com