java - 如何为 enitymanager 编写单元测试?
问题描述
因此,我正在学习 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);
}
但它给了我一个 NullPointerException -
MockHttpServletResponse result = mockMvc.perform(req).andReturn().getResponse();
有什么建议么?
解决方案
如果您的目标是纯粹测试控制器,请使用@WebMvcTest
和@MockBean
. 这将允许您测试请求映射,同时应将业务逻辑提取到新的@Repository
bean 并单独进行测试,测试命中内存数据库。
EntityManager
应该通过点击实际数据库进行测试,因为这是检查 ORM 配置的最明智的方法。如果您的实体映射是可移植的,您可以使用 H2 内存数据库。
您应该分离@Controller
,@Service
和@Repository
应用程序的层。这样做将使您的代码更易于维护和测试。
推荐阅读
- git - Git 更改未应用在背面
- html - 在 ayah sysmbol 的末尾写上数字
- java - Spring data jpa - 具有表的所有可能值的字段
- html - CSS 样式链接不适用于我的导航链接
- android - Android TextToSpeech 仅在调试模式下工作
- pytorch - 如何使用 pytorch 构建多维自动编码器
- jquery - 选择选项不会触发 Jquery
- c# - 找不到名称为 Pomelo.EntityFrameworkCore.MySql 的提供程序程序集
- eclipse - 自定义现有菜单项
- c++ - 使用 Cmake 编译 QtGstreamer 时出错,Mingw32 编译器附带 QT 5.12.3