我将向我的方法发送一个实体作为它们的参数,这意味着我已经拥有要从数据库中插入、更新或删除的信息。我用我的持久性单元名称注入了实体管理器,所以我知道它有效,我的实体管理器的名称是“em”。我使用数据库连接从我的数据库中映射了我的类,我正在处理的类被命名为“TipoUsuario”这些是我的方法:public void insert(TipoUsuario tipoUsuario) throws Exception { if (em != null) { em.persist(tipoUsuario); }}public void update(TipoUsuario tipoUsuario) throws Exception { if (em != null) { em.merge(tipoUsuario); }}public void delete(TipoUsuario tipoUsuario) throws Exception { if (em != null) { em.remove(tipoUsuario); }}我正在研究第一种方法(插入),但我不知道如何测试我的方法......这是我测试插入方法的方法:@Testpublic void testInsert() throws Exception { System.out.println("insert"); TipoUsuario tipoUsuario = new TipoUsuario(1, "Mantenedor", "AC2354", true); //Instance of my class where I have my insert, update and delete methods Utilidades instance = new Utilidades(); //I mock an entity manager with annotation @Mock and I pass that mocked entitytmanager to my the entitymanager that I have in my main class instance.em = this.em; //and that's all i got.. I don't know how to test if it really works //i send my entity to my methor insert instance.insert(tipoUsuario); //i dont know what is return o how to use the assertEquals in this case... assertEquals( ?, ?);}我嘲笑了实体管理器,因为那不是我代码的一部分,我知道其他人之前已经测试过,我唯一想测试的是我的方法是否将信息插入到数据库中。
2 回答
波斯汪
TA贡献1811条经验 获得超4个赞
您可以使用
Mockito.verify(em, Mockito.times(1)).persist(tipoUsuario);
查看是否调用了 persist 方法 1 次。
慕后森
TA贡献1802条经验 获得超5个赞
我嘲笑了实体管理器,因为那不是我代码的一部分,我知道其他人之前已经测试过,我唯一想测试的是我的方法是否将信息插入到数据库中。
如果 entitymanager 被模拟,则对它的方法调用不是真实的,因此不会对 DB 进行真正的更新。正如查尔斯回答的那样,您只能验证该方法确实被调用了一次且仅被调用一次,但如果实体管理器被模拟,则验证数据对我来说没有意义。
将实时插入(或任何真正的数据库调用)作为单元测试的一部分是不可取的,因为单元测试通常在构建时运行,而此时可能无法使用真正的数据库。如果失败的单元测试意味着您的构建失败,那么您将遇到麻烦。
如果您真的希望这样做,请尝试在单元测试的上下文中使用一些内存数据库来完成您的测试。
此外,您要完成的工作可能属于集成测试而不是单元测试 - 请考虑这些问题。
如果您真的对 JPA/DAO/数据层的单元测试感兴趣,请查看 Apache DBUnit 和其他一些类似的框架。
添加回答
举报
0/150
提交
取消