gpt4 book ai didi

java - stub 和验证中的 Mockito 重复

转载 作者:行者123 更新时间:2023-11-30 05:50:24 24 4
gpt4 key购买 nike

看来在某些情况下,EasyMock stub 可以代替验证。举个简单的例子:

A类:

public class A {
private B b;

public A(B b) {
this.b = b;
}

int main(int input) {
return b.timesThree(input + 4);
}
}

B类:

public class B {
int timesThree(int input) {
return input * 3;
}
}

ATest 类:

@ExtendWith(MockitoExtension.class)
public class ATest {
@Mock
B b;

@InjectMocks
A a;

@Test
void testMain() {
doReturn(21).when(b).timesThree(7);

int result = a.main(3);
assertEquals(21, result);

verify(b).timesThree(7);
}

}

verify 调用有意义吗? when 调用已断言 b.timesThree() 的输入参数为 7。

最佳答案

在这种情况下没有。这取决于你在测试中真正想要断言的内容。

在这里,您尝试测试当使用值调用 main 方法时,应该发生 2 件事

  1. timesThree 应该用 value+4 调用

  2. 从 timesThree 返回的值应该由您的主函数返回

由于在您的测试中,以下三行足以断言上述两种情况,因此您不需要在此处进行验证。

doReturn(21).when(b).timesThree(7);
int result = a.main(3);
assertEquals(21, result);

确定测试是否足够好的最简单方法是注释掉部分实现并使测试失败 (TDD)。只要你的测试不及格,你就很好。

例如:将 4 更改为 5 - 测试失败,删除输入测试失败

假设您的 timesThree 方法没有返回值,而是将其存储在某处

int main(int input) {
//Stores value somwhere
b.timesThree(input + 4);
}

在这里,您的测试必须断言 timesThree 被调用一次,且值为 7。在这种情况下,您需要验证,因为如果没有验证,您将永远无法获得失败的测试。

另外,注释之一提到“如果代码被 return 21 替换,测试就会通过;”

为了证明您的测试不受此影响,请考虑使用随机整数而不是硬编码值。这将确保您的实现中不会出现意外的硬编码。随机整数的示例库 https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/math/RandomUtils.html#nextInt()

关于java - stub 和验证中的 Mockito 重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54012956/

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