bal*_*teo 5 spring dependency-injection spring-test spring-boot spring-boot-test
我对 Spring 集成测试有疑问。
行为:
当我单独运行下面的测试时,它是成功的。
然而,当运行所有测试时,其中许多测试(包括下面的测试)都会出错。
当我忽略下面的测试并运行所有测试时,所有测试都成功。
我没有包含错误堆栈跟踪,因为它与我们的业务逻辑高度相关,并且我怀疑该错误与我对 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());
...
Run Code Online (Sandbox Code Playgroud)
请注意,这DataKeyStore是 的依赖项TokenTools。
正如我上面所说,我怀疑测试正在互相踩踏,并且我@SpyBean以某种方式泄漏了其他测试类......
我的问题是如何确保该测试不会影响其他测试?我尝试了@DirtiesContext注释,但没有效果...
另外令我困惑的是它@SpyBean已经重置(根据文档/javadoc)。
有人可以帮忙吗?
编辑:使用我的 IDE 调试测试表明,TokenTools所有测试仅实例化两次:一次是在测试初始化时,第二次是@SpyBean为上面的测试创建 。在上面的测试之后运行的其余测试使用第二个实例,即实例@SpyBean......
小智 5
我最近遇到了同样的问题。确保为您的
@DirtiesContext注释设置正确的 classMode。
默认情况下,将在完成测试类后@DirtiesContext重置。@SpyBean您可能想在每个测试方法之前或之后重置它。
因此,将@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)或添加@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)到您的测试类中。
我可以确认这@DirtiesContext对我们也不起作用。在关闭旧上下文(通过@DirtiesContext注释)后,我们在为新上下文初始化数据库(使用 Liquibase)时遇到问题。
我们最终为伪造一些本的测试以不同的方式命名 Spring 测试上下文:
例如:
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = SpringBootApp.class, name = "mainContext")
public class TestThatDoesntFakeBeans(){
}
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = SpringBootApp.class, name = "contextWithFakeBean")
public class TestThatFakeBeans(){
@SpyBean
//...
}
Run Code Online (Sandbox Code Playgroud)
这样,就会为每个名称创建单独的 Spring 上下文。测试重用具有相同名称的上下文。但当然,您需要确保具有相同上下文名称的测试不会相互影响。
| 归档时间: |
|
| 查看次数: |
4598 次 |
| 最近记录: |