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

Spring HATEOAS 与 Spring Data Rest

Spring Data Rest 和 Hateoas

如何删除 Spring HATEOAS 中的“_embedded”属性