我已经开发了一些具有相似行为的类,它们都实现了相同的接口。我实现了一个工厂,它创建适当的对象并返回接口。我正在为工厂写一个单元测试。你得到的只是一个对象的接口。测试工厂是否正常工作的最佳方法是什么?
我想知道Java语言的答案,但如果有跨语言的解决方案,我想知道它。
第二,在答案中,会像另一个答案一样做吗?如果是这样,我也会将另一个答案标记为已接受,并重新编写我的问题,以说明返回接口的工厂和您不知道实现该接口的具体类类型的工厂,以及您确实知道使用了哪个具体类的情况。
发布于 2008-09-01 00:47:23
因为我不知道你的工厂方法是什么样的,所以我现在能建议的就是
MyInterfaceImpl1);
发布于 2015-12-10 18:14:34
您要做的不是单元测试
如果测试返回的对象是否是特定具体类的实例,则不是单元测试。您正在进行集成测试。虽然集成测试很重要,但它不是一回事。
在单元测试中,您只需要测试对象本身。如果对返回的抽象对象的具体类型进行断言,则是在测试返回对象的实现。
一般的对象单元测试
在进行单元测试时,您需要断言四件事:
此外,您只需要测试可以从对象实例中观察到的内容,即公共接口。否则,您会将自己绑定到一组特定的实现细节上。这将要求您在这些细节发生变化时更改您的测试。
单元测试工厂
对工厂进行单元测试真的没什么意思,因为你对queries的返回对象的行为不感兴趣。该行为(希望)在其他地方进行测试,可能是在对对象本身进行单元测试时。您真正感兴趣的只是返回的对象是否具有正确的类型,如果您的程序编译成功,这一点是可以保证的。
由于工厂不会随着时间的推移而改变(因为这样它们将成为"Builders",这是另一种模式),因此没有命令可供测试。
工厂负责实例化对象,因此它们不应该依赖其他工厂来完成这项工作。它们可能依赖于生成器,但即便如此,我们也不应该测试生成器的正确性,只测试生成器是否接收到消息。
这意味着您需要在工厂上测试的是它们是否将消息发送到它们所依赖的对象。如果你使用依赖注入,这几乎是微不足道的。只需模拟单元测试中的依赖项,并验证它们是否接收到消息。
单元测试工厂摘要
就这样。如果没有依赖项,就没有什么需要测试的了。可能只是断言返回的对象不是null引用。
集成测试工厂
如果您要求返回的抽象对象类型是特定具体类型的实例,则需要进行集成测试。
这里的其他人已经回答了如何使用instanceof操作符来实现这一点。
发布于 2008-09-01 00:49:19
if (myNewObject instanceof CorrectClass)
{
/* pass test */
}更新:
不知道为什么这会被减记,所以我会稍微扩展一下...
public void doTest()
{
MyInterface inst = MyFactory.createAppropriateObject();
if (! inst instanceof ExpectedConcreteClass)
{
/* FAIL */
}
}https://stackoverflow.com/questions/37310
复制相似问题