关于抽象类扩展的强制测试

关于抽象类扩展的强制测试

问题描述:

我有一个具有良好测试覆盖率的抽象类。我想确保该类的任何扩展也通过了抽象类的测试。有没有什么方法可以确保使用JUnit的代码?关于抽象类扩展的强制测试

+0

是否有可能以一个实例添加到您问题的链接? – CKing

+0

我可以忍受你的痛苦,但是有别于其他方式给子类创作者的*。我不知道有没有办法。 –

+0

举个例子:如果classB重写classA的方法我想确保testClassAMethod仍然通过classB或强制classB重写testClassAMethod – Lumpy

我不认为有一种简单的方法可以自动完成。

请参阅this question试图获取给定类的所有子类以获取更多关于原因的详细信息。

所有在你的子类中没有改变的方法在抽象类的测试中被检查。 未更改的方法不需要在扩展类的范围内再次进行测试。

如果某种方法被覆盖,那么对它们应用相同的测试将会是一个不同的错误决定,因为它们可能具有不同的业务逻辑。因此,如果有人继承你的班级,他应该为他已经被覆盖的方法写出他自己的测试。

这是更改或添加逻辑业务逻辑的所有继承点。

+0

我试图解决的问题是扩展课程的人可能不知道它可能会破坏的所有方式。如果他们覆盖该类并且看到测试失败,他们可以覆盖测试,或修复该方法以使测试不会失败。否则,他们甚至不知道他们的代码正在破坏。 – Lumpy

所以我想过一些解决方法,我不知道你是否会喜欢它,但让我们试试。

我的解决方案是进行测试,以查找您的抽象类的所有实现 实例化所有Concert类然后它将在所有Concert类上运行相同的测试。

您将需要以下API通过反射让所有子类

<dependency> 
     <groupId>org.reflections</groupId> 
     <artifactId>reflections</artifactId> 
     <version>0.9.9-RC1</version> 
</dependency> 

,然后使用它像这样

Reflections reflections = new Reflections("packageName"); 
Set<Class<? extends YourClass>> classes = reflections.getSubTypesOf(YourClass.class); 

然后实例和运行

要与运行各个测试不同的实现你需要@RunWith(Parameterized.class)

这是关于如何做参数测试在JUnit

Easy way of running the same junit test over and over?