我有一项测试可以通过:
public class TransformerTest {
private final MyTransformer transformer = new MyTransformerImpl();
@Rule
public final OutputCapture outputCapture = new OutputCapture();
@Test
public void successShouldLogSuccessMessages() {
final B result = transformer.transform(new A());
outputCapture.expect(containsString("First message"));
outputCapture.expect(containsString("Second message"));
}
}
转换器使用log4j通过log.debug("First message")
和log.debug("Second message")
记录两行。我可以运行此测试1,000次,它将通过。
当我介绍这个测试课程时
@WebFluxTest
@RunWith(SpringRunner.class)
public class DummyTest {
@Autowired
private WebTestClient client;
@MockBean
private MyService service;
@Test
public void dummyTest() {
doRequest()
.expectStatus().isAccepted()
.expectBody().isEmpty();
}
private WebTestClient.ResponseSpec doRequest() {
return client.post()
.uri("/")
.exchange();
}
}
新测试可靠地通过-但是,仅当使用Maven运行构建时,第一个测试(看来与此无关)现在失败。
失败消息是:
TransformerTest.successShouldLogSuccessMessages 预期:(包含“第一条消息”的字符串和包含“第二条消息”的字符串),但:包含“第一条消息”的字符串为“”
有人知道会发生什么吗?第一个测试是否已经从根本上存在缺陷,而第二个测试的引入仅仅是在暴露此缺陷,还是第二个测试的引入从根本上改变了测试套件的行为?
我的整个surefire配置是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<excludedGroups>com.example.IntegrationTest</excludedGroups>
</configuration>
</plugin>
这些测试都不是集成测试组的一部分。我尚未修改用于并行或派生的surefire默认值。由于这只是我通过surefire与Maven一起运行时遇到的一个问题,这是否可能是竞争条件?
我可以在多台机器上以100%的可靠性重现此问题。