2

我正在尝试为 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

4

3 回答 3

2

解决方案最终变得非常简单:我需要在测试中添加一行:

  @Spy
   private ModelResourceAssembler modelResourceAssembler;

并且 bean 被实例化并正确连接

于 2014-09-13T15:22:00.080 回答
1

在您的示例中,您使用@InjectMocks但不为ModelResourceAssembler. 您不会凭空得到一个实例。

您使用MockitoJUnitRunner.class. 它不知道 Spring bean。对于测试 Spring 应用程序,您更愿意使用SpringJUnit4ClassRunner.class.

于 2014-09-12T19:56:56.313 回答
0

如果我可以建议,如果您为控制器使用构造函数注入,那么您可以模拟依赖项而不需要 spring junit 测试运行器的东西。

于 2014-09-16T17:11:56.013 回答