Mockito + Spring + @PostConstruct,模拟初始化错误,为什么会调用@PostConstruct?

5

I have a set up like:

Bean class:

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);
}

测试类:用@Autowire注入bean。

似乎当Mockito在TestConfig中创建Mock对象时,它调用了@PostConstruct,这似乎是在map字段初始化之前调用的,因此会抛出异常。

我的问题是:

  • 为什么Mockito要调用@PostConstruct?
  • 如何禁用@PostConstruct以进行Mock?

编辑:显然,在Spring从配置的@Bean方法中返回bean之前,调用是在实例化后完成的。

1个回答

4

Mockito 不会调用 @PostConstruct 方法 -- 是 Spring 在调用。你在你的测试用例中使用了 @Autowired 注解,但这不是 Mockito 的注解。

如果你想使用 @Mock 注解,你会发现 Mockito 不会调用你的 @PostConstruct 方法。

换句话说,你需要像这样编写你的测试类:

@Mock Bean myBean;

@Before
public void before() {
    MockitoAnnotations.initMocks();
}

你似乎是对的。这是Spring!但它是在@Configuration@Bean方法返回实例之后被调用的。我该如何禁用它? - Whimusical
我觉得不行。除非你正在编写一个用于多个组件的集成测试,否则在单元测试中最好使用模拟对象。 - john16384

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接