我对弹簧集成测试有疑问。
行为:
当我单独运行下面的测试时,它是成功的。
但是,当所有测试都运行时,其中许多测试包括下面的测试都是错误的。
当我忽略下面的测试并运行所有测试时,一切都成功了。
我没有包含错误堆栈跟踪,因为它与我们的业务逻辑高度相关,我怀疑该错误与我对 spring boot test 的使用有关@SpyBean
。
这是测试:
@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = "test")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
...
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private DataKeyStore dataKeyStore;
@SpyBean
private TokenTools tokenTools;
...
@Test
public void myTest() throws Exception {
doReturn("someGeneratedToken")
.doReturn("someGeneratedToken")
.doCallRealMethod()
.when(tokenTools)
.createToken(any(TokenProfile.class), anyString(), anyString());
...
请注意,这DataKeyStore
是TokenTools
.
正如我上面所说,我怀疑测试正在互相踩踏,并且我@SpyBean
在其他测试类上以某种方式泄漏......
我的问题是如何确保此测试不会踩到其他测试?我试过@DirtiesContext
注释无济于事......
另外让我感到困惑的@SpyBean
是已经重置(根据文档/javadoc)。
有人可以帮忙吗?
编辑:使用我的 IDE 调试测试表明TokenTools
所有测试仅实例化两次:一次在测试初始化时,第二次用于@SpyBean
为上面的测试创建。在上述测试之后运行的其余测试使用第二个实例,即@SpyBean
实例......