我们的一个类使用系统属性来加载配置文件。在特定的测试案例中,我们将此属性设置为无效值,以检查这种情况下被测类(CUT)的行为。
同一类也可用于各种集成测试中。由于我们使用的是JUnit Jupiter的parallel test execution capabilities,因此在引擎盖下使用CUT的那些集成测试中,我们正在见证比赛条件。由于系统属性有时仍然无效,因此失败了。
并行性本身是通过Maven Surefire插件全局配置的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<properties>
<configurationParameters>
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.config.dynamic.factor=1
</configurationParameters>
</properties>
</configuration>
</plugin>
因此,默认情况下,所有测试都并行运行。 CUT看起来像这样:
class AttributesProviderTest {
@Test
@ResourceLock( value = SYSTEM_PROPERTIES, mode = READ_WRITE )
void invalid_attributes_file_should_yield_UncheckedIOException() throws Exception {
final Properties backup = new Properties();
backup.putAll( System.getProperties() );
final String attributesFile = "foo";
System.setProperty( AttributesProvider.ATTRIBUTES_FILE_PROPERTY, attributesFile );
assertThatThrownBy( AttributesProvider::getTestInstance )
.isExactlyInstanceOf( UncheckedIOException.class )
.hasMessage( "Cannot read attributes file '" + attributesFile + "'." );
System.setProperties( backup );
}
// Some other tests...
}
可以看出,我们正在尝试synchronize系统属性访问。但是,如果我理解正确,那么这仅适用于其他带有@ResourceLock
注释的测试,并且通常无法神奇地同步系统属性访问吗?
有没有一种方法可以解决竞赛条件(不注释所有其他测试)?一些想法: