gpt4 book ai didi

java - 单元测试: how much do I need to mock?

转载 作者:行者123 更新时间:2023-11-30 03:12:45 25 4
gpt4 key购买 nike

我目前正开始开始单元测试,但我不知道要模拟什么,不应该模拟什么。我的理解是,我想要测试的类应该完全隔离,因此它只处理模拟。

例如,如果我有一个类,其中有一个方法,它会调用 getAnyobject()。然后它调用其 anyObject.getId() 方法并存储它。在我的单元测试中,我编写了一个方法 build(),在其中创建 AnyObjectanyObj 的实例。然后我使用 setId(01) 设置一个 ID。

构建完所有内容后,我编写了一个测试方法。我在那里写:doReturn(anyObj).when(classUnderTest.theServiceIuse.getAnyObject())。我这样做是因为,如果 serviceIuse.getAnyObject() 无法正常工作,我的测试就会失败。除此之外,我还必须模拟 AnyObject 类中的 getID() 方法。因为我不想测试 AnyObject 类。

我真的需要模拟这么多,还是我没有必要调用 setID() 方法?

最佳答案

请记住这一点。如果编写的代码易于测试,则不需要模拟。例如,您可以仅使用空实现覆盖方法。

这就是为什么你几乎不需要模拟 POJO;您可以轻松创建一个实例并使用它。当代码调用“执行太多操作”(例如与数据库通信)或具有太多依赖项的方法时,您需要模拟。

一个典型的案例是测试服务Foo。在实际代码中,Foo 需要其他服务来完成其工作。对于测试,您只想确保 Foo 正确使用其他服务(即检查是否遵守 API);您实际上并不希望其他服务执行任何操作。问题是您无法轻松地从测试中禁用服务(例如告诉 Java“调用 formatHarddrive() 方法时不要执行任何操作)。

解决方法是为该服务创建一个模拟,然后以某种方式将其注入(inject)到 Foo 中。该模拟仅公开尽可能少的 API。

模拟的另一个原因是测试错误处理。为此,您希望代码中的某些点出现异常。模拟框架提供了实现此目的的舒适方法。

关于java - 单元测试: how much do I need to mock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276021/

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