2017-02-08 81 views
1

我有一組像:Mockito + Spring + @PostConstruct,模擬初始化錯誤,爲什麼叫@PostConstruct?

類:

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

測試類:其中@Autowires豆。

當Mockito在TestConfig中創建模擬器時,它似乎調用@PostConstruct,而這個@PostConstruct在映射字段初始化之前似乎被調用,因此它會引發異常。

我的問題是:

  • 爲什麼打電話的Mockito @PostConstruct?
  • 如何禁用@PostConstruct進行模擬?

編輯:顯然呼叫實例化後進行春季從配置的@Bean方法

回答

2

的Mockito retrns豆之前並沒有叫@PostConstruct - 春天。你說你在測試中使用@Autowired,這不是Mockito註釋。

如果您打算使用@Mock,您會發現Mockito不會調用您的@PostConstruct方法。

換句話說,寫你的測試類是這樣的:

@Mock Bean myBean; 

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

你似乎是正確的。春天了!!但是它在'@ Configuration'的'@ Bean'方法中返回實例後調用。我該如何禁用它? – Whimusical

+0

我不認爲你可以。除非你正在爲多個組件編寫集成測試,否則最好使用mock進行單元測試。 – john16384

相關問題