我有一个非常简单的休息控制器:
@RestController public class MyController { @Autowired public Logger logger;
通过以下配置注入记录器依赖项:
@Configuration public class MyConfig { @Bean public Logger logger() { return LoggerFactory.getLogger(MyController.class); }
如果我运行包含控制器的Spring应用程序,那么一切正常.但是,在运行单元测试时,我无法设法实现此依赖注入.在这种情况下,我有以下测试配置:
@Configuration @Profile("test") public class MyTestConfig { @Bean public Logger logger() { return LoggerFactory.getLogger(MyCOntroller.class); }
这是我的单元测试代码的相关部分:
@RunWith(MockitoJUnitRunner.class) @ContextConfiguration(classes = MyTestConfig.class) @ActiveProfiles("test") public class MyContollerTest {
但是,记录器对象没有"自动装配" MyController
(请注意,我不想模拟记录器对象),这会导致空指针引用.
我错过了什么?
单元测试不应使用任何Spring配置.您应该简单地实例化您的组件,并手动注入依赖项(通常是假的).
你使用了现场注入,这让它变得有点困难.使用构造函数注入,您需要做的就是
Logger logger = LoggerFactory.getLogger(MyController.class); MyController controller = new MyController(logger);
可以的Mockito帮助注射假依赖于你,虽然,使用字段注入,由于即使@Mock
,@Spy
和@InjectMocks
注解:
@Spy private Logger logger = LoggerFactory.getLogger(MyController.class); @InjectMocks private MyController controller; @Before public void prepare() { MockitoAnnotations.initMocks(this); }
也就是说,如果我没有弄错,你就不会使用@RunWith(SpringJUnit4ClassRunner.class)
,所以你的测试运行器对Spring一无所知,因此不会创建或使用任何Spring配置.