Spring HATEOAS Resource assembler 未在单元测试中实例化
Posted
技术标签:
【中文标题】Spring HATEOAS Resource assembler 未在单元测试中实例化【英文标题】:Spring HATEOAS Resource assembler is not instantiated in unit test 【发布时间】:2014-11-07 00:12:08 【问题描述】:我正在尝试为 REST 控制器编写一个单元测试,该控制器通过 Resource assembler 类生成 HATEOAS 链接。生产中一切正常,但单元测试资源汇编程序类没有被注入控制器。
我的资源汇编类是:
@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 实例始终为空。由于应用程序是 Spring Boot,它没有 WebCoonfig 类,并且自动装配的 WebApplicationContext 始终为空,所以我不能(并且真的不想,因为我正在运行单元测试)通过 webAppContextSetup 实例化 MockMvc
【问题讨论】:
【参考方案1】:解决方案非常简单:我需要在测试中添加一行:
@Spy
private ModelResourceAssembler modelResourceAssembler;
并且 bean 被实例化并正确连接
【讨论】:
【参考方案2】:在您的示例中,您使用@InjectMocks
,但没有为ModelResourceAssembler
声明模拟。你不会凭空得到一个实例。
您使用MockitoJUnitRunner.class
。它不知道 Spring bean。对于测试 Spring 应用程序,您更愿意使用 SpringJUnit4ClassRunner.class
。
【讨论】:
使用 SpringJUnit4ClassRunner 的问题在于,在 Mockito 注入模拟之前实例化所有 bean。在我的例子中,真正的 modelPersistenceHandler 而不是它的 mock 被实例化并且测试立即失败,因为 modelPersistenceHandler 试图与数据库对话。 @MrkK 如果您将其替换为模拟 bean(!),则不会。无论如何,当前的问题在第一段中进行了解释。第二个只是一个建议。【参考方案3】:如果我可以建议,如果您对控制器使用构造函数注入,那么您可以只模拟依赖项而不需要 spring junit 测试运行器的东西。
【讨论】:
以上是关于Spring HATEOAS Resource assembler 未在单元测试中实例化的主要内容,如果未能解决你的问题,请参考以下文章
我在尝试实现hateoas时遇到编译时错误,它没有向我显示方法On方法
Spring Boot:HATEOAS 和自定义 JacksonObjectMapper
强制spring hateoas生成https链接而不是http