假设我正在为移动应用构建按月订阅收费功能,则有多种收费方式。它可以通过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);
}
}
任何派生的测试类都将实现抽象方法,因此它有责任实现validate方法。派生的测试类不需要知道基础测试中发生的事情,因为他们可以仅基于输入来验证输出。
有什么建议以更优雅的方式解决这个问题?在这种情况下我可以应用任何设计模式吗?
答案 0 :(得分:3)
在我看来,您的继承示例并不是使用这两种抽象方法的最佳方法。一个是建设性的,另一个是静态的-您可以对另一个条例草案进行验证。
在两种情况下,继承都不是正确的关系。您可以成功将Factory模式用于“ getBillCharger”或更现代的TestDataBuilders或ObjectMother模式。
对于第二种方法,您可以只使用一个助手类。 如果您需要在Test类中多次调用相同的构造逻辑,则可以使用@Before
一个重要方面是,如果将tests_case_1放在超类中,则将隐藏逻辑的一部分,并且测试不会那么明显。我更喜欢更明确和可见的测试用例,因此我会避免这种设置。
答案 1 :(得分:0)
实际上,原始方法确实应用了一种设计模式,称为Template Method。
OTOH,问题本身就有一点点寻找设计模式的气味。如果他们已经有了满足功能(此处是:测试正确的东西)和非功能(此处:将公用部分与特定部分明确分开)要求的解决方案,那么何必麻烦呢。我会接受的一个原因是:交流,例如:能够给设计起一个名字,以便同事们快速理解我的意图。