我有一个控制器,可以将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();
}
}
提前致谢。
答案 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();
}