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 版本

Mockito Bug在Spring 2.0.0.RELEASE

使用Spring和Mockito测试RabbitMQ