因此,我正在学习SpringMVC的单元测试用例,并且对于Spring-Boot来说,它还很新。
我想为此我拥有的mvc控制器方法编写一个单元测试用例
@RequestMapping("/college")
@RestController
public class college {
@PersistenceContext
private EntityManager em;
@RequestMapping(value = "/request", method = RequestMethod.GET)
public List<Object> display() {
//List<StudentDB> val = temp.findAll();
Query query = em.createNativeQuery("SELECT * FROM STUDENT");
List<Object> val = (List<Object>)query.getResultList();
return val;
}
我试图写这样的东西-
@SpringBootTest
public class MockTestCollegeController {
@Mock
private EntityManager em;
@InjectMocks
private college col;
@Autowired
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(col).build();
}
@Test
public void dets() throws Exception
{ RequestBuilder req =MockMvcRequestBuilders.get("/college/request").accept(MediaType.APPLICATION_JSON);
MockHttpServletResponse result = mockMvc.perform(req).andReturn().getResponse();
//System.out.println(result.getResponse().getContentAsString());
//String expected = "{id:1,content:'Hello, World!'}";
Query query = em.createNativeQuery("SELECT * FROM STUDENT");
List<Object> val = (List<Object>)query.getResultList();
Assert.assertEquals(val, result);
}
但是它在-
处给了我NullPointerExceptionMockHttpServletResponse result = mockMvc.perform(req).andReturn().getResponse();
有什么建议吗?
答案 0 :(得分:0)
如果您的目标是纯粹测试控制器,请使用@WebMvcTest
和@MockBean
。这样一来,您就可以在测试请求映射的同时,将业务逻辑提取到新的@Repository
bean中,并通过对内存数据库的测试来进行单独测试。
EntityManager
应该通过访问实际数据库进行测试,因为这是检查ORM配置的最明智的方法。如果您的实体映射是可移植的,则可以使用H2内存数据库。
您应将应用程序的@Controller
,@Service
和@Repository
层分开。这样做将使您的代码更具可维护性,并且更易于测试。