在他的书 Java Design 中,Peter Coad说子类应该满足的五个标准之一是子类“不是仅仅是一个实用类的子类(你想要的有用功能)重用)。“对于Java中的一个例子,他说将你的一个域类作为the Observable
class的子类违反了他的规则:“Observable是一个实用类,一组有用的方法 - 仅此而已。”
在这种情况下,这里有一些示例测试类,在我写完的实际测试之后被模式化:
class BaseDataGeneratorTestCase (unittest.TestCase):
def _test_generate_data(self, generator, expected_value):
# Imagine there's a lot more code here, making it
# worthwhile to factor this method out.
assert generator.generate_data() == expected_value
class DataGeneratorTests (BaseDataGeneratorTestCase):
def test_generate_data(self):
self._test_generate_data(DataGenerator(), "data")
class VariantDataGeneratorTests (BaseDataGeneratorTestCase):
def test_generator_data(self):
self._test_generate_data(VariantDataGenerator(),
"different data")
虽然这个例子很简单,但考虑到真正的测试及其周围系统当然要复杂得多。我认为这个例子可以作为一种工具,试图澄清一些关于正确使用继承的困惑。
子类化BaseDataGeneratorTestCase
是个坏主意吗?它是否有资格作为“有用的功能[我想]重用”? _test_generate_data
应该只是一个函数吗,而不是任何类?
答案 0 :(得分:1)
基本上你可以用任何你喜欢的方式解决问题。 OOP只是一种范例,可以帮助您以更清晰,更可维护的方式设计事物。
那么,在你想要使用继承时,你应该问自己的问题是,他们有相同的角色,你只想添加功能?或者你想只使用“基础”类中的好方法?
这只是一个概念问题,在你的小例子中,它可以采用相同的概念,但基本上,你只是将基类用作实用程序。
如果你希望基类实际上是一个基类,你应该设计它,这样每个继承的类都会表现得相似。
我同意从概念上讲,为所有类似的测试都有一个单元测试基类是有意义的。