天天看點

@MockBean 注解後 bean成員對象為 null?

筆者在寫自測的時候遇到的問題:

我想模拟一個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這樣的産品會有很多種。