gpt4 book ai didi

java - 使用 `when` 作为验证

转载 作者:行者123 更新时间:2023-12-02 03:43:18 25 4
gpt4 key购买 nike

我有一个在数百个测试中使用的实用方法来模拟自定义随机发生器的返回值。这是我的代码的(高度人工的)模型:

interface CardRandomiser{
Card getCard(Suit suit);
}

void mockCard(Suit suit, Face face) {
CardRandomiser rand = mock(CardRandomiser.class);
when(rand.getCard(suit)).thenReturn(new Card(suit, face));
Game.setCardRandomiser(rand);
}

这可以用作:

mockCard(Suit.CLUBS, Face.QUEEN);
Card card = pickACardAnyCard();
assertThat(card.getFace(), is(Face.QUEEN));

然而,这使得一些错误有点难以发现。如果被测方法错误地请求 Suit.HEARTS,则模拟返回 null,并且断言正确失败。但无法通过错误消息判断传递给模拟的内容。

显然我可以通过验证来处理这个问题。我可以将模拟从 mockCard 函数传回,然后单独验证是否使用正确的值进行了调用。但这确实使测试断言变得困惑,而这些断言与正在测试的内容并不真正相关。鉴于每次调用此方法时,我都会指定一个预期的参数值,我更愿意将断言放在一个位置。请注意,这一切都发生在调用被测方法之前

理想情况下,我希望 when 语句在使用意外值调用时抛出异常。像这样的东西:

when(rand.getCard(suit)).thenReturn(new Card(suit, face));
when(rand.getCard(intThat(not(is(suit))))).thenThrow(new IllegalArgumentException());

这可以工作,并在调用 getCard 时停止测试,这是更好的方法。但它仍然不允许我显示错误的论点是什么。

我还尝试使用ArgumentCaptor,然后检查捕获的值。但很明显它们是用于 verify 语句而不是 when 语句。

是否有标准的 Mockito 方法可以做到这一点,或者我是否需要使用 verify 语句来扰乱我的测试?

最佳答案

您可以使用thenAnswer配置mockito答案,例如

private CardRandomiser mockCard(final Suit suit, final Face face) {
CardRandomiser rand = mock(CardRandomiser.class);

when(rand.getCard(any(Suit.class))).thenAnswer(new Answer<Card>() {
@Override
public Card answer(InvocationOnMock invocation) throws Throwable {
if(!suit.equals(invocation.getArguments()[0])) {
throw new IllegalArgumentException(
String.format("Value %s passed, but mocked for %s", invocation.getArguments()[0], suit));
}
return new Card(suit, face);
}
});

return rand;
}

关于java - 使用 `when` 作为验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36589305/

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