Spring Boot - 如何测试从配置文件中添加了Model属性?

时间:2017-09-26 19:41:51

标签: spring-boot junit mocking mockito

我有一个控制器,可以将application.properties的属性添加到Model对象:

@Value("${products}")
private String prod;

@GetMapping("/")
public String greetingForm(Model model) throws IOException {

    List<String> products = Arrays.asList(prod.split("\\s*,\\s*"));

    model.addAttribute("products",products);

    return "form";
}

我该如何测试这种方法?我对单元测试相当新,所以任何建议都会受到赞赏。我知道我必须以某种方式模仿Model,但每当我尝试运行测试时,我都会得到NullPointerException

我的测试:

private MockMvc mockMvc;

@MockBean
private Model model;

@Before
public void setUp() {
    this.mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build();
}



@Test
public void testHomeRoute() {

        try {

            List<String> products = new ArrayList<String>();
            products.add("Product1");
            products.add("Product2");

            mockMvc.perform(get("/"))
                .andExpect(MockMvcResultMatchers.view().name("form"))
                .andExpect(MockMvcResultMatchers.model().attribute("products",products));
                ;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}

提前致谢。

1 个答案:

答案 0 :(得分:0)

您需要确保application.properties的副本位于src / test / resources文件夹中,以确保单元测试能够获取这些属性。

还要确保您的测试类使用@SpringBootTest进行注释,以便将加载属性的相关配置加载到测试中。

编辑:您也不想在控制器上拨打新电话:

this.mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build();

通过自己实例化它不再是一个Spring bean,并且@Value注释将无法正确地注入到此类中。相反,您应该自动装配您的Controller并使用它来构建您的MockMvc。

@Autowired
private WebController webController;

@Before
public void setUp() {
    this.mockMvc = MockMvcBuilders.standaloneSetup(webController).build();
}