Mockito + Spring + @PostConstruct,mock初始化错误,为啥会调用@PostConstruct?
Posted
技术标签:
【中文标题】Mockito + Spring + @PostConstruct,mock初始化错误,为啥会调用@PostConstruct?【英文标题】:Mockito + Spring + @PostConstruct, mock initialization error, why is @PostConstruct called?Mockito + Spring + @PostConstruct,mock初始化错误,为什么会调用@PostConstruct? 【发布时间】:2017-06-26 00:59:55 【问题描述】:我有这样的设置:
Bean类:
private final Map<String, String> configCache = new HashMap<>();
@PostConstruct
private void fillCache() (...) configCache.clear();
TestConfig 类:
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
@Primary
public Bean beanMock()
return Mockito.mock(Bean.class);
Test 类:哪个@Autowires
bean。
似乎当 Mockito 在 TestConfig 中创建模拟时,它调用了 @PostConstruct ,而 @PostConstruct 又似乎在映射字段初始化之前被调用,因此它引发了异常。
我的问题是:
为什么 Mockito 调用 @PostConstruct? 如何禁用 @PostConstruct 进行模拟?编辑:显然调用是在 Spring 从 Config 的 @Bean 方法中重新调用 bean 之前的实例化之后完成的
【问题讨论】:
【参考方案1】:Mockito 没有调用 @PostConstruct
-- Spring 是。你说在你的测试中你使用@Autowired
,这不是一个Mockito注解。
如果您打算使用 @Mock
,您会发现 Mockito 不会调用您的 @PostConstruct
方法。
换句话说,像这样编写你的测试类:
@Mock Bean myBean;
@Before
public void before()
MockitoAnnotations.initMocks();
【讨论】:
你似乎是对的。春天了!!但它是在@Configuration
的@Bean
方法中返回实例后调用的。如何禁用它?
我不认为你可以。除非您正在为多个组件编写集成测试,否则最好使用模拟进行单元测试。以上是关于Mockito + Spring + @PostConstruct,mock初始化错误,为啥会调用@PostConstruct?的主要内容,如果未能解决你的问题,请参考以下文章
在spring中简单使用Mockito解决Bean依赖树问题
如何使用 Mockito 在 Spring 中模拟自动装配的 @Value 字段?
Mockito 用 Spring 模拟:“传递给 verify() 的参数不是模拟!”
Spring Boot gradle 插件强制 Mockito 版本