gpt4 book ai didi

java - 在单元测试中检查工厂的结果

转载 作者:太空狗 更新时间:2023-10-29 22:42:35 25 4
gpt4 key购买 nike

我开发了一些具有相似行为的类,它们都实现了相同的接口(interface)。我实现了一个创建适当对象并返回接口(interface)的工厂。我正在为工厂编写单元测试。你得到的只是一个对象的接口(interface)。测试工厂是否正常工作的最佳方法是什么?

我想知道 Java 的答案,但如果有跨语言的解决方案我想知道。

答案中的第 2 个,会像其他答案一样完成吗?如果是这样,我也会将另一个答案标记为已接受,并改写我的问题以解决返回接口(interface)的工厂并且您不知道实现该接口(interface)的具体类的类型,以及您确实知 Prop 体类是什么的情况用过。

最佳答案

你要做的不是单元测试

如果您测试返回的对象是否是特定具体类的实例,则您不是在进行单元测试。您正在进行集成测试。虽然集成测试很重要,但两者并不是一回事。

在单元测试中,你只需要测试对象本身。如果您对返回的抽象对象的具体类型进行断言,则您正在测试返回对象的实现。

一般的对象单元测试

单元测试时,有四件事,你要断言:

  1. 查询(非 void 方法)的返回值是您期望的值。
  2. 命令的副作用(void 方法)会按照您的预期修改对象本身。
  3. 接收发送到其他对象的命令(这通常使用模拟来完成)。

此外,您只想测试可以从对象实例(即公共(public)接口(interface))观察到的内容。否则,您将自己束缚于一组特定的实现细节。这将要求您在这些细节发生变化时更改测试。

单元测试工厂

对工厂进行单元测试真的很无趣,因为您对查询返回对象的行为不感兴趣。该行为(希望)在其他地方进行了测试,可以在对该对象本身进行单元测试时进行推测。您真正感兴趣的只是返回的对象是否具有正确的类型,如果您的程序可以编译,这是可以保证的。

由于工厂不会随时间变化(因为那时它们将成为“构建器”,这是另一种模式),因此没有要测试的命令。

工厂负责实例化对象,因此它们不应依赖其他工厂来为它们执行此操作。它们可能依赖于 Builder,但即便如此,我们不应该测试 Builder 的正确性,而只是测试 Builder 是否收到消息。

这意味着您必须对工厂进行测试的是它们是否将消息发送到它们所依赖的对象。如果你使用依赖注入(inject),这几乎是微不足道的。只需在单元测试中模拟依赖项,并验证它们是否收到消息。

单元测试工厂总结

  1. 不要测试返回对象的行为或实现细节!您的工厂不负责对象实例的实现!
  2. 测试是否接收到发送给依赖项的命令。

就是这样。如果没有依赖关系,则无需测试。除了可能断言返回的对象不是 null 引用。

集成测试工厂

如果您要求返回的抽象对象类型是特定具体类型的实例,那么这属于集成测试。

这里的其他人已经回答了如何使用 instanceof 运算符来做到这一点。

关于java - 在单元测试中检查工厂的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37310/

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