Spring HATEOAS资源汇编程序在单元测试中未实例化



我正试图为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测试运行程序。

相关内容

  • 没有找到相关文章

最新更新