我有许多按继承层次结构组织的 Objective-C 类。它们都有一个共同的父级,该父级实现了子级之间共享的所有行为。每个子类都定义了一些使其工作的方法,并且父类为旨在由其子类实现/覆盖的方法引发异常。这有效地使父类成为伪抽象类(因为它本身没有用),即使 Objective-C 没有明确支持抽象类。
这个问题的症结在于我正在使用 OCUnit 对这个类层次结构进行单元测试,并且测试的结构类似:一个测试常见行为的测试类,其子类对应于每个被测子类。然而,在(有效抽象的)父类上运行测试用例是有问题的,因为如果没有关键方法,单元测试将以惊人的方式失败。(在 5 个测试类中重复常见测试的替代方法实际上并不是一个可接受的选择。)
我一直在使用的非理想解决方案是检查(在每个测试方法中)实例是否是父测试类,如果是则退出。这会导致在每个测试方法中重复代码,如果一个人的单元测试非常精细,这个问题会变得越来越烦人。此外,所有此类测试仍会执行并报告为成功,这会影响实际运行的有意义测试的数量。
我更喜欢向 OCUnit 发出信号“不要在这个类中运行任何测试,只在它的子类中运行它们”。据我所知,(还)没有一种方法可以做到这一点,类似于+(BOOL)isAbstractTest
我可以实现/覆盖的方法。关于以最少重复次数解决此问题的更好方法的任何想法?OCUnit 是否有能力以这种方式标记测试类,或者是时候提交 Radar 了吗?
编辑:这是有问题的测试代码的链接。注意启动方法的频繁重复if (...) return;
,包括NonConcreteClass()
为简洁起见使用宏。