2014-09-12 29 views
1

我正在嘗試爲通過資源彙編程序類生成HATEOAS鏈接的REST控制器編寫單元測試。生產中一切正常,但通過單元測試資源彙編程序類不會被注入到控制器中。Spring 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

在您的示例中您使用@InjectMocks,但不要聲明ModelResourceAssembler的模擬。你不會從任何地方得到一個實例。您可以使用MockitoJUnitRunner.class。它不知道春豆。對於測試Spring應用程序,您寧可使用SpringJUnit4ClassRunner.class

+0

使用SpringJUnit4ClassRunner的問題是在Mockito注入模擬前實例化所有的bean。在我的情況下,真正的modelPersistenceHandler而不是它的模擬被實例化,並且測試立即失敗,因爲modelPersistenceHandler試圖與數據庫交談。 – MrkK 2014-09-13 15:10:42

+0

@MrkK如果您使用模擬** bean(!)**替換它,請不要使用它。無論如何,目前的問題在第一段中解釋。第二個只是一個建議。 – zeroflagL 2014-09-13 15:15:43

1

該解決方案最終是相當簡單:我需要一個行添加到我的測試:

@Spy 
    private ModelResourceAssembler modelResourceAssembler; 

和bean實例化和正確連線

0

如果我可以建議,如果你使用的構造函數注入你的控制器,那麼你可以嘲笑的依賴性,並不需要春季junit測試亞軍的東西。

相關問題