在更复杂的单元测试中,我经常需要一组特定的规则。其中一些规则与另一个规则有依赖关系。由于排序是相关的,因此我使用 RuleChains。到目前为止一切都很好。
然而,这在大多数测试中都是重复的(偶尔使用附加规则)。这种重复不仅感觉没有必要重复,而且重复起来很麻烦,而且在需要集成附加规则时,还需要在很多地方进行调整。
我想要的是Rule of Rules,即包含或聚合其他(应用程序和测试特定)规则的(预定义)规则。
我将举例说明目前的情况:
public LoggingRule logRule = new LogRule();
public ConfigurationRule configurationRule = new ConfigurationRule();
public DatabaseConnectionRule dbRule = new DatabaseConnectionRule();
public ApplicationSpecificRule appRule = new ApplicationSpecificRule();
@Rule
RuleChain chain = RuleChain.outerRule(logRule)
.around(configurationRule)
.around(dbRule)
.around(appRule);
假设给定的规则相互依赖,例如 ApplicationSpecificRule 要求首先执行 DatabaseConnectionRule 以建立连接,ConfigurationRule 初始化了一个空配置等。还假设对于这个(相当复杂的测试)所有规则都是实际需要。
到目前为止,我能想到的唯一解决方案是创建返回预定义规则链的工厂方法:
public class ApplicationSpecificRule extends ExternalResource
{
public static RuleChain basicSet()
{
return RuleChain.outerRule(new LogRule())
.around(new ConfigurationRule())
.around(new DatabaseConnectionRule())
.around(new ApplicationSpecificRule());
}
}
在测试中,这可以按如下方式使用:
@Rule
RuleChain chain = ApplicationSpecificRule.basicSet();
这样就可以删除重复项,并且可以轻松集成其他规则。甚至可以将特定于测试的规则添加到该规则链。但是,当需要进行其他设置时,无法访问包含的规则(假设您需要这些ApplicationSpecificRule
规则才能创建某些域对象等)。
理想情况下,这将扩展为也支持使用其他预定义的集合,例如advandancedSet
建立在规则之上的集合basicSet
。
这可以以某种方式简化吗?首先这是一个好主意还是我以某种方式滥用了规则?对重组测试有帮助吗?想法?