我正试图为REST控制器编写一个单元测试,该控制器通过Resource汇编程序类生成HAEOAS链接。生产中一切正常,但在单元测试中,资源汇编程序类不会被注入控制器中。
我的资源汇编程序类是:
@Component
public class ModelResourceAssembler extends ResourceAssemblerSupport<Model, ModelResource> {
public ModelResourceAssembler() {
super(ModelRestController.class, ModelResource.class);
}
@Bean
public ModelResourceAssembler modelResourceAssembler(){
return new ModelResourceAssembler();
}
@Override
public ModelResource toResource(Model model) {
...
}
}
控制器为:
@Controller
@RequestMapping("/demo")
@ComponentScan(basePackages = {"com.foo.demo"} )
public class ModelRestController {
@Autowired
private ModelPersistenceHandler modelPersistenceHandler;
@Autowired
private ModelResourceAssembler modelResourceAssembler;
...
}
以及单元测试:
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes= {ModelResourceAssembler.class, ModelRestController.class})
public class ModelRestControllerTest {
private MockMvc mockMvc;
@InjectMocks
private ModelRestController modelRestController;
@Mock
private ModelPersistenceHandler modelPersistenceHandler;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(modelRestController).build();
}
...
}
无论我做什么,ModelResourceAssembler实例始终为null。由于该应用程序是Spring Boot,它没有WebCoonfig类,并且自动连接的WebApplicationContext始终为null,因此我无法(也确实不想,因为我正在运行单元测试)通过webAppContextSetup 实例化MockMvc
解决方案非常简单:我需要在测试中添加一行:
@Spy
private ModelResourceAssembler modelResourceAssembler;
并且bean被实例化并正确连接
在您的示例中,您使用@InjectMocks
,但没有为ModelResourceAssembler
声明mock。你不会凭空得到一个例子。
您使用MockitoJUnitRunner.class
。它不知道春天的豆子。对于测试Spring应用程序,您更希望使用SpringJUnit4ClassRunner.class
。
如果我可以建议,如果您对控制器使用构造函数注入,那么您可以模拟依赖关系,而不需要spring-junit测试运行程序。