筆者在寫自測的時候遇到的問題:
我想模拟一個Bean,并在之後使用Mockito打樁,于是使用了 @MockBean 注解(spring內建mockito的産物),但代碼編寫好了後啟動測試卻報NullPointerException
好家夥,bean沒有Mock上。
交代一下我的代碼背景:
架構:SpringBoot、SpringBoot Test、TestNG、Mockito
@SpringBootTest
@TestPropertySource("classpath:application.properties")
@TestExecutionListeners(MockitoTestExecutionListener.class)
public class XXXServiceTest extends AbstractTestNGSpringContextTests {
@MockBean
XXXComponent xxxComponent; // null ???
}
解決辦法
// 在測試類上加
@TestExecutionListeners(MockitoTestExecutionListener.class)
原因
因為Spring內建TestNG的抽象類:
AbstractTestNGSpringContextTests
上并沒加關于Mockito相關的測試監聽器,是以就沒有運用上MockBean的注解功能,看源碼
@TestExecutionListeners({ServletTestExecutionListener.class, DirtiesContextBeforeModesTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class})
public abstract class AbstractTestNGSpringContextTests implements IHookable, ApplicationContextAware {
PS:官方也有讨論過這個issue,但官方并不打算內建進來,是以叫大家自己加個Listener則是,我認為也是該這樣,因為Mockito這樣的産品會有很多種。