【问题标题】:How to write unit tests for enitymanager? [duplicate]如何为 enitymanager 编写单元测试? [复制]
【发布时间】:2019-06-06 20:23:58
【问题描述】:

所以我正在学习 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();

有什么建议吗?

【问题讨论】:

  • 不要在控制器中使用实体管理器。了解三层架构
  • 好的,不过还是在学习,我暂时保持简单,我计划尽快添加服务和dal。

标签: java spring-mvc junit mockito entitymanager


【解决方案1】:

如果您的目标是纯粹测试控制器,请使用 @WebMvcTest@MockBean。这将允许您测试请求映射,同时应将业务逻辑提取到新的 @Repository bean 并单独进行测试,同时测试内存数据库。

EntityManager 应该通过实际的数据库进行测试,因为这是检查 ORM 配置的最明智的方法。如果您的实体映射是可移植的,您可以使用 H2 内存数据库。

您应该将应用程序的@Controller@Service@Repository 层分开。这样做将使您的代码更易于维护和测试。

【讨论】:

  • 我确实考虑过使用H-2进行内存测试,但问题是,我计划稍后在我的项目中使用MS-SQL存储过程,H-2似乎不支持那。所以我想尝试使用 Mockito 测试控制器,然后稍后使用实际数据库进行更多集成测试。
  • @tryhard 相反,您可以使用 Docker 和 Test Containers 来启动 a MSSQL database container 仅用于测试。
猜你喜欢
  • 2018-01-17
  • 2012-01-06
  • 2019-03-17
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多