在JUnit 4.10及更低版本中,可以将规则注释为@规则和@ClassRur。这意味着规则会在类之前/之后以及每次测试之前/之后被调用。这样做的一个可能原因是设置一个昂贵的外部资源(通过@ClassRur调用),然后廉价地重置它(通过@Rur调用)。
从JUnit 4.11开始,@规则字段必须是非静态的,@ClassRule字段必须是静态的,因此上述操作不再可行。
有明确的变通方法(例如,明确地将@Class规则和@规则职责划分为单独的规则),但不得不强制使用两个规则似乎是一种耻辱。我简要地看了一下使用@规则并推断它是否是第一个/最后一个测试,但我不相信信息是可用的(至少,它不能直接在描述中获得)。
在JUnit 4.11中,是否有一种整洁的方式将@ClassRule和@Rule功能组合到一个规则中?
谢谢罗文
另一种可能的解决方法是声明一个非静态@规则,并让它对静态合作者起作用:如果合作者还没有初始化,@规则知道它是第一次运行(因此它可以设置它的合作者,例如启动外部资源);如果它们被初始化,@规则可以完成它的每次测试工作(例如重置外部资源)。
这有一个缺点,@规则不知道何时处理了最后一个测试,因此无法执行任何类后操作(例如整理外部资源);然而,可以使用@AfterClass方法来实现这一点。
另一种可能的解决方法是声明静态@类规则,并在声明非静态@规则时使用该值:
@ClassRule
public static BeforeBetweenAndAfterTestsRule staticRule = new BeforeBetweenAndAfterTestsRule();
@Rule
public BeforeBetweenAndAfterTestsRule rule = staticRule;
这意味着您不必重构任何现有的规则类,但您仍然需要声明两个规则,因此它不能很好地回答原始问题。
从JUnit 4.12(编写时未发布)起,可以同时使用@规则和
@类规则对单个静态规则进行注释。
请注意,它必须是静态的-用
@rule
和@ClassRule
注释的非静态规则仍然被视为无效(因为任何注释的@ClassRule
都在类级别工作,所以只有作为静态成员才有意义)。
如果您对更多细节感兴趣,请参阅发行说明和我的请求。
根据4.12发行说明,可以使用@Rule和@ClassRule对测试类的静态成员进行注释: 同时使用@Rule和@ClassRule注释的静态成员现在被认为是有效的。这意味着可以使用单个规则在类之前/之后(例如设置/拆除外部资源)和测试之间(例如重置外部资源)执行操作, 我想使用此功能在文件中所有测试开始时初始化资源,在每个测试之间对资源进行一些清理,并在所有测试完成后将其丢弃。此资源当前由扩展E
混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 <beans xmlns="http://www.springframework.org/schema/b
混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 # 数据源配置 # 数据源名称,多数据源以逗号分隔 spring.shardingsphere.datas
混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 dataSources: # 配置真实存在的数据源作为名称 write_ds: # ...省略
混合配置的规则项之间的叠加使用是通过数据源名称和表名称关联的。 如果前一个规则是面向数据源聚合的,下一个规则在配置数据源时,则需要使用前一个规则配置的聚合后的逻辑数据源名称; 同理,如果前一个规则是面向表聚合的,下一个规则在配置表时,则需要使用前一个规则配置的聚合后的逻辑表名称。 配置项说明 /* 数据源配置 */ HikariDataSource writeDataSource0 = new H