典型的例子是:
@ContextConfiguration(locations = {
"classpath:someITTest-mock.xml",
"classpath:someITTest-context.xml",
"classpath:commons.xml"})
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeITTest {
//...
}
我正在寻找在测试期间重建模拟的方法。使用DirtiesContext的明显方法 但是当只重新创建模拟上下文时,它会重新创建所有上下文。
以下是几点说明:
那么有没有办法重新创建模拟创建的弹簧上下文,但是保留其他上下文?
答案 0 :(得分:1)
更新:如果您使用的是Spring Boot 1.4,则可以通过@MockBean
使用其对模拟bean的一流支持。
那么有没有办法重新创建模拟创建的弹簧上下文,但是保留其他上下文?
不,这是不可能的。
在您的示例中,实际上只有一个单ApplicationContext
从所有三个XML配置文件加载。如果使用@ContextHierarchy
创建层次结构,则会有多个上下文;但是,不可能仅重新加载父上下文(请参阅我在此主题中发布的其他评论)。
但是,人们在这种情况下采取的一种常见方法是明确重置有问题的模拟。
基本上有两种方法可以达到这个目的。
@Autowired
),您只需重置 之后 方法中的模拟(例如, JUnit 4中的@After
方法。TestExecutionListener
,从ApplicationContext
检索模拟的bean并重置它们(例如,在afterTestMethod()
方法中)。此致
Sam( Spring TestContext Framework的作者)
答案 1 :(得分:0)
您可以使用@ContextHierarchy
和@DirtiesContext
:
@ContextHierarchy({
@ContextConfiguration(name="parent",
locations = {"classpath:someITTest-context.xml", "classpath:commons.xml"}),
@ContextConfiguration(name="child",
locations = "classpath:someITTest-mock.xml")
})
@DirtiesContext(hierarchyMode = CURRENT_LEVEL)
这样,只需要重新加载子上下文,请参阅Testing。