gpt4 book ai didi

java - 我应该在测试方法中模拟本地方法调用吗?

转载 作者:行者123 更新时间:2023-11-30 08:23:27 25 4
gpt4 key购买 nike

关于单元测试概念的问题:

class A {
public void m1() {
// code
m2();
//code
}

public void m2() {
//some code
}

}

根据最佳实践,我应该如何测试m1方法?单元是类还是方法?

我的观点 - 我应该单独测试 m2 而我不应该测试 m1m2 集成。

要使用我的观点已经够难了——我应该使用复杂的框架进行测试并使用非常现代的东西。

按照我对单元测试的感觉,测试应该是简单的!如果你的代码很好,你可以不用复杂的东西来测试它。但是在 m1() 内部调用 m2() 是正常代码。

请澄清我的误解。

更新:

模拟示例(伪代码):

//prepare
A testClass = mock(A.class);
when(testClass.m2()).doNothing();
when(testClass.m1()).callRealMethod();
//execute:
testClass.m1();
//verify
check testClass state after method m1 invocation.

这就是我测试模拟类的方式。这正常吗?

最佳答案

首先,当你进行单元测试时,测试所有的公共(public)方法。在您的示例中,m1m2 是公开的,因此您需要对两者进行测试。

您可能想要 stub 或模拟 m2 有几个原因:

  1. 如果在测试 m1 时遇到任何问题,因为 m1 调用了 m2、stub 或 mock m2 。您可能会遇到的一些问题:

    • m2 可能调用外部服务
    • m2 可能只是速度慢
    • 可能很难用满足m2的参数调用m1(你的m2没有参数,但我说的一般)
  2. 有时,当您测试调用另一个方法的方法并同时测试另一个方法时,您会发现这两个方法的测试之间存在重复——有些调用方法的测试确实在测试被调用的方法。通过从调用方法中 stub 或模拟被调用方法来解决这个问题,测试调用方法足以证明被调用方法被调用,并彻底测试被调用方法。

  3. 如果你做 TDD,你可能会先写 m1,然后再写 m2。然后,您将对 m2 进行 stub 或模拟,以便您对 m1 的测试能够通过,然后继续测试和编写 m2

但是,如果您没有任何理由 stub 或模拟 m2,请不要这样做。一个方法以不需要 stub 或模拟的方式调用其他方法是常见且合理的。被调用的方法可能简短而简单,或者调用方法可能只是为了可读性而被分解成一堆辅助方法。如果被调用的方法在另一个类中也是如此(因为它被多个调用方法使用);如果通过调用它的方法的测试对其进行了全面测试,并且测试之间没有重复,则无需 stub 或模拟。

上面模拟 m2 而不运行 m1 的例子是一件非常正常的事情,它完成了工作,但它很难看,因为 Mockito 接管了所有一个类的方法。您可以使用 Mockito spy 做得更好,在这里讨论:What is the difference between mocking and spying when using Mockito? .

A a = spy(new A());
doNothing().when(spy).m2();
a.m1();
# check state of a

关于java - 我应该在测试方法中模拟本地方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23653583/

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