我想测试一个Spring组件,这个组件有一个autowired属性,为了进行单元测试,我需要修改这个属性。问题是,这个类在构造后方法中使用了autowired组件,所以我无法在实际使用之前替换它(即通过ReflectionTestUtils)。
我该怎么做呢?
这是我想测试的类:
@Component
public final class TestedClass{
@Autowired
private Resource resource;
@PostConstruct
private void init(){
//I need this to return different result
resource.getSomething();
}
}
这是一个测试用例的基础:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class TestedClassTest{
@Autowired
private TestedClass instance;
@Before
private void setUp(){
//this doesn't work because it's executed after the bean is instantiated
ReflectionTestUtils.setField(instance, "resource", new Resource("something"));
}
}
在调用postconstruct方法之前,是否有某种方法可以将资源替换为其他资源?比如告诉SpringJUnit运行器自动连接不同的示例?
8条答案
按热度按时间ep6jt1vc1#
您可以使用Mockito。我不确定是否具体使用
PostConstruct
,但通常可以使用:6tqwzwtp2#
SpringBoot1.4 引入 了 名 为
@MockBean
的 测试 注解 , 所以 现在 SpringBoot 本身 就 支持 对 Springbeans 的 模拟 和 监视 。5rgfhyps3#
您可以提供一个新的testContext.xml,在其中定义的
@Autowired
bean是测试所需的类型。gajydyqb4#
我创建了blog post on the topic。它还包含了到Github仓库的链接和工作示例。
技巧是使用测试配置,在这里你用一个假的spring bean覆盖原来的spring bean。
kse8i1jr5#
您可以使用spring-reinject https://github.com/sgri/spring-reinject/通过模拟来覆盖bean定义
5cg8jx4n6#
集成测试中的另一种方法是定义一个新的Configuration类,并将其作为
@ContextConfiguration
提供。在配置中,您将能够模拟您的bean,并且您还必须定义在测试流中使用的所有类型的bean。举个例子:knpiaxh17#
对于Junit5,您可以使用以下命令进行模拟:
w8ntj3qf8#