gpt4 book ai didi

unit-testing - 测试是否调用了模拟方法有什么意义?

转载 作者:行者123 更新时间:2023-12-04 11:56:14 24 4
gpt4 key购买 nike

好的,所以这可能是一个危险的问题。我已经做了一段时间的单元测试,但是由于某种原因,我今天早上醒来,问了自己这个问题。

假设我有一个 UserFactory 接口(interface),它有 CreateUser 方法。

在某些时候我需要创建一个用户权利?因此,我创建了一个测试,检查是否在适当的位置为 UserFactory 调用了 CreateUser。

现在,单元测试与实际代码非常耦合——这很好。但也许有点太多了?如中所示,打破测试的唯一方法是不调用 CreateUser。我们没有检查它的实现等,而只是检查接口(interface)是否被调用。但是,无论谁删除了该调用,都会有一个失败的测试,并最终从验证 CreateUser 被调用的步骤中删除验证语句。

我已经看到这种情况一遍又一遍地发生。

有人可以把灯带回给我并解释为什么验证模拟对象的方法已被调用是有益的吗?我可以理解为什么设置它们可能很有用,比如 CreateUser 应该为代码的后面部分返回一个虚拟用户,但是在我们简单且仅验证它们是否被调用的地方是吸引我的部分。

谢谢!

最佳答案

验证模拟对象通常是必要的,正如您所提到的,单元测试有时与被测类紧密耦合。

我不知道如何对你的问题给出一个好的答案,但我会尝试的。

以这段代码为例,其中 userRepository 是一个依赖项(示例不是很好)。

public void doSomething(User user) {
if( user.isValid() ) {
userRepository.save(user)
} else {
user.invalidate();
}
}

对此进行测试的一种方法是插入连接到数据库的真实存储库,并验证用户是否被持久化。但是由于我是单元测试,所以我的测试中不能有外部依赖。

现在,您还需要哪些其他选项来验证用户有效的场景?由于 userRepository.save() 返回 void,所以验证副作用的唯一方法是验证是否调用了 mock。
如果我不验证模拟,那么单元测试就不会很好,因为我可以删除保存对象的行,并且测试仍然会通过。

对于一些返回值的模拟,情况并非如此,然后在方法中使用了值。这通常意味着如果模拟返回 null,则应用程序会抛出 NullPointerException(在 java 的情况下)。

关于unit-testing - 测试是否调用了模拟方法有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924542/

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