为了账号安全,请及时绑定邮箱和手机立即绑定

使用 junit 构建基本单元测试和抽象验证

使用 junit 构建基本单元测试和抽象验证

大话西游666 2021-09-12 10:37:13
假设我正在为移动应用程序构建按月订阅收费功能,有多种收费方式。可以通过 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); }}任何派生的测试类都将实现抽象方法,因此它有责任实现验证方法。派生测试类不需要知道基础测试中发生了什么,因为它们可以根据输入验证输出。有什么建议可以以更优雅的方式解决这个问题吗?我可以在这种情况下应用任何设计模式吗?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

在我看来,您的继承示例并不是使用这两种抽象方法的最佳方式。一个是结构性的,另一个是静态的 - 您可以根据另一个法案验证一个法案。

在这两种情况下,继承在这里都不是正确的关系。您可以成功地将工厂模式用于“getBillCharger”或更现代的 TestDataBuilders 或 ObjectMother 模式。

对于第二种方法,您可以只使用辅助类。如果需要在 Test 类中多次调用相同的构造逻辑,可以使用 @Before

一个重要的方面是,如果您将 tests_case_1 放在超类中,您将隐藏部分逻辑并且您的测试不会那么明显。我更喜欢更明确和可见的测试用例,因此我会避免这种设置。


查看完整回答
反对 回复 2021-09-12
?
青春有我

TA贡献1784条经验 获得超8个赞

事实上,最初的方法确实应用了一种设计模式,它称为Template Method

OTOH,这些问题本身就带有寻找设计模式作为目标的轻微气味。为什么要麻烦,如果他们手头已经有了满足功能(此处:测试正确的东西)和非功能(此处:将公共部分与具体部分明确分开)要求的解决方案。我会接受的一个原因是:沟通,例如:能够为设计命名,以便同事快速了解我的意图。


查看完整回答
反对 回复 2021-09-12
  • 2 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信