java - 使用junit构建基本单元测试和抽象验证
问题描述
假设我正在为移动应用构建包月收费功能,有多种收费方式。它可以通过 Apple Pay、Google 钱包、paypal、visa/master 取决于平台。每个提供者都有自己的实现和各自的 JUnit 测试(因为他们使用 Java)。
为了评估几个基本功能,每个实现都必须验证的情况很少。因此,计划是编写基础测试并调用抽象验证方法。
这是我的方法,
public abstract class BaseBillingTest
{
public abstract BillCharger getBillCharger();
public abstract void ValidateTest1(Bill input, Bill output);
public void tests_case_1(){
Bill input = new Bill(<some value>);
Bill Output = getBillCharger().charge(input);
ValidateTest1(input, output);
}
}
任何派生的测试类都将实现抽象方法,因此它有责任实现验证方法。派生的测试类不需要知道基础测试中发生了什么,因为它们可以根据输入验证输出。
有什么建议可以以更优雅的方式解决这个问题吗?我可以在这种情况下应用任何设计模式吗?
解决方案
在我看来,您的继承示例并不是采用这两种抽象方法的最佳方式。一个是建设性的,另一个是静态的——你验证一个法案与另一个法案。
在这两种情况下,继承在这里都不是正确的关系。您可以成功地将工厂模式用于“getBillCharger”或更现代的 TestDataBuilders 或 ObjectMother 模式。
对于第二种方法,您可以只使用辅助类。如果您需要在 Test 类中多次调用相同的构造逻辑,您可以使用 @Before
一个重要方面是,如果您将 tests_case_1 放在超类中,您将隐藏部分逻辑,并且您的测试不会那么明显。我更喜欢更明确和可见的测试用例,因此我会避免这种设置。
推荐阅读
- reactjs - Styled-systems 不会出现在 web 上,就像它在移动设备上的 react native 一样
- android - 检查 RecyclerView 项目的子视图是否在屏幕上可见
- wpf - 为什么 TextBlock 的大小不适合其内容?
- django - 如何使用外键在 Django 模型中执行注释?
- python - 打开泡菜文件时内核死机 Pandas
- html - 页面右侧有奇怪的小白间距
- mysql - Docker Compose MySql 和 Python 不工作
- python - 在 0 Hz 处获得 FFT 结果峰值
- windows - 在 Win 10 中为 Mongo 设置自定义主路径
- python - 如何连接到 QSqlDriver 通知信号