Junit:为删除实体的方法编写测试?

2023-11-26

最会是什么详尽的我可以为以下代码编写测试吗?

public void deleteFromPerson(person person) {
    person = personRepository.returnPerson(person.getId());
    personRepository.delete(person);
}

该方法在a service班级。该方法调用Jpa存储库然后称之为delete()实体上的方法。

如果无法测试实体是否正在被删除,是否有任何other tests cases我可以运行该方法吗?


有两种测试策略。一是单元测试,即确保您的服务正常运行。另一个是集成/端到端测试,即确保一切都能很好地协同工作。

你对你拥有的东西进行单元测试,你对你拥有的一切进行集成测试。这是一个非常粗略的例子,仅使用您的陈述,加上一些我无法填补空白的虚构内容。

单元测试

使用 Mockito

PersonRepository personRepository = mock(PersonRepository.class);

@TestSubject
PersonService personService = new PersonService(): 

@Test
public void unitTest() {
    personService.setPersonRepository(personRepository);
    Person person = new Person(1L);
    Person person2 = new Person(1L);

    when(personRepository.returnPerson(1L)).thenReturn(person2); //expect a fetch, return a "fetched" person;

    personService.deleteFromPerson(person);

    verify(personRepository, times(1)).delete(person2); //pretty sure it is verify after call
}

使用 EasyMock...

@Mock
PersonRepository personRepository; //assuming it is autowired

@TestSubject
PersonService personService = new PersonService(): 

@Test
public void unitTest() {
    Person person = new Person(1L);
    Person person2 = new Person(1L);

    EasyMock.expect(personRepository.returnPerson(1L)).andReturn(person2); //expect a fetch, return a "fetched" person;
    personRepository.delete(person2);
    EasyMock.expectLastCall(); //expect a delete for person2 we plan to delete
    replayAll();

    personService.deleteFromPerson(person);

    verifyAll(); //make sure everything was called
}

是的,这个测试看起来编写得很严格,但无论如何,这确实是您在单元测试中测试的全部内容。您希望数据库使用参数从数据库中获取人员,因此为什么有两个Person对象,并且您希望删除传递的对象Person对象,这就是您期望调用的原因。简单的方法产生简单的测试。您基本上希望确保您按照预期与存储库进行交互。在实际实现中存储库可能会损坏或为空,但这不会改变您的服务已正确实现的事实。

集成测试

另一方面,如果您想进行集成测试,则不使用模拟。相反,您需要像连接一样连接所有东西test DB和回购协议。我将把它留给你,因为没有实施参考。

@Test
public void integrationTestForAddAndDelete() {
    Person person = createDummyPersonForInsertion(); //static method that creates a test Person for you
    Person comparePerson;
    //make sure we haven't added the person yet
    Assert.assertNull(personService.getPerson(person));

    //add the Person
    comparePerson = personService.addPerson(person);
    Assert.assertNotNull(personService.getPerson(person));
    //add a rigorous compare method to make sure contents are the same, i.e. nothing is lost or transmuted incorrectly, ignoring ID if that is autogen
    //alternatively, you can create a unit test just for Person
    Assert.assertEquals(person, comparePerson); 

    //remove the Person
    personService.deleteFromPerson(person);
    Assert.assertNull(personService.getPerson(person));

    //test for exception handling when you try to remove a non-existent person;
    personService.deleteFromPerson(person);

    //test for exception handling when you try to remove null
    personService.deleteFromPerson(null);
}

在这种情况下,您需要确保您的存储库实际上处理来自服务的所有调用。您知道您的服务可以通过单元测试运行,但是存储库是否可以通过服务运行或者您配置了错误的内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Junit:为删除实体的方法编写测试? 的相关文章

随机推荐

  • 指针是否也有任何地址或内存分配?

    如果指针存储变量的地址 那么我们从哪里获得指针呢 我问的是 如果我们直接使用指针 那么一定有一个位置可以从哪里获取这个指针 是的 声明的指针在内存中有自己的位置 在上面的示例中 您有一个变量 b 它存储值 17 int b 17 the v
  • C#:编组包含数组的结构

    我正在做一些 C 互操作工作 我有以下结构 pragma pack push 1 typedef struct unsigned int64 Handle LinkType t Type LinkState t State unsigned
  • 使用 LessCSS 用户定义函数?

    我最近刚刚接触 LessCSS 我遇到了我认为的主要限制 我想知道是否有办法做到这一点 我想说我在某处读到 Sass 允许用户定义函数 但 LessCSS 会做同样的事情吗 我想要做什么 fs 16 either return the va
  • 如何在 Elm 中提交表单?

    这是一个非常基本的问题 但我没有找到任何例子 我有这样的看法 view address model div div text lt ID toString model id form input value model title text
  • SES AWS 错误代码:SignatureDoesNotMatch,状态代码:403

    我在尝试通过 Amazon SES 发送邮件时收到 AWS 错误代码 SignatureDoesNotMatch 状态代码 403 我已确认我使用的是通过以下方式创建的正确凭据https console aws amazon com iam
  • 检查 GET 中是否传递了任何变量

    我已经做了一些搜索 但没有得出任何结果 我确信这是显而易见的 基本上 我试图弄清楚是否有任何内容通过 GET 从表单传递 我知道如何检查单个元素 但我只想快速检查是否有任何内容通过 Cheers 使用时要小心count GET 如果您提交包
  • 如何在ActionBar的导航选项卡中设置自定义View并使选项卡适应其高度?

    我正在使用ActionBar我想设置一个自定义View在导航选项卡中 选项卡的高度似乎是固定的 我的自定义View较大 所以不适合 我尝试自定义样式 如下所示 但它并没有使选项卡更高 如何让选项卡的高度适应我的自定义View size 我知
  • 压缩 xml 文件的 Subversion diff

    我正在使用 MySQL Workbench 来维护应用程序的数据库架构 这 mwbWorkbench 使用的文件是一个压缩的 XML 文档 保存在 Subversion 存储库中 该文件被 Subversion 视为二进制数据 因此我无法使
  • 有没有办法跟踪批处理文件的执行情况?

    我继承了一些大型批处理文件 我想将它们重写为更 开发人员友好 的语言 我想了解以下几点 它调用了什么其他脚本 它启动了哪些其他进程 它写入哪些文件 它使用哪些环境变量 设置哪些环境变量 对于最后一点 我知道在开始之前我可以这样做 set g
  • Opengls eglCreateWindowSurface GL 错误 EGL_BAD_ALLOC

    我正进入 状态eglCreateWindowSurface GL Error EGL BAD ALLOC在三星 Galaxy S6 中安装后首次打开应用程序时 相同的代码在其他设备中运行良好 我尝试清理内存并销毁纹理并在销毁时取消初始化所有
  • 无法在 64 位 Linux 上构建 32 位 Wine

    我正在尝试这样做 使用 automake 配置脚本在 64 位 Linux 上构建 32 位 对我不起作用 编译酒 我在 config log 中找到了这个 configure failed program was confdefs h d
  • 使用 Python 处理 MySQL 未读结果

    我使用 mysql connector 进行 SQL 操作 我有一个简短的脚本 它在光标上执行以下操作 字符串 cursor execute use format db show tables command ALTER TABLE Obj
  • 使用 Array.CreateInstance 和 new 运算符实例化数组的区别

    我可以看到以下两种在 C 中实例化 int 数组的方法 通过 API系统 数组抽象类 var arrayInstance Array CreateInstance typeof int 4 通过各种数组初始化语法 var arrayInst
  • PHP 中的自动图像格式检测

    我正在寻找一种方法来获取当前放置在临时位置的用户上传的图像 例如 tmp jkhjkh78 并从中创建 php 图像 自动检测格式 有没有比一堆尝试 捕获 jpeg 图像 png 图像等更聪明的方法来做到这一点 这是的功能之一获取图像大小
  • iPhone 上的内嵌 html5 视频

    我想在 iPhone 上播放 HTML5 视频 但每当我尝试播放时 当调用视频 play 时 iPhone 都会自动弹出全屏 如何在 iPhone 不改变 UI 的情况下内嵌播放视频 如下所示 http www easy bits com
  • 使用 kubernetes 执行器时 Airflow-dag_id 无法找到问题

    我正在使用气流稳定的 Helm Chart 并使用 Kubernetes Executor 正在为 dag 安排新的 pod 但它因 dag id 无法找到问题而失败 我正在使用 git sync 来获取 dags 以下是错误和 kuber
  • UITableViewCell 圆角和剪辑子视图

    我在任何地方 搜索引擎 文档 此处等 都找不到任何内容来显示如何在也剪辑子视图的元素上创建圆角 尤其是在分组表视图中 我有代码可以正确地从具有 4 个弧 圆角 的路径创建一个圆角矩形 该代码已在我的子类 uitableviewcell 中的
  • 在 PHP 中处理格式错误的 JSON

    我正在尝试编写一个 php 脚本来处理来自以字符串形式提供 json 的 Web 服务的数据 问题是字符串并不是真正的 json 这是 JavaScript 具体来说 尽管变量被引用 但键未被引用 示例 实际数据更长且更复杂 desc Us
  • 无法读取 CFPrefsPlistSource iOS 10 中的值

    我今天已将 Xcode 8 更新到 beta 2 并尝试在 App 和 Today Extension 之间共享数据 我面临着这个日志警告 2016 07 08 18 00 24 732472 ProjetctX 941 42801 用户默
  • Junit:为删除实体的方法编写测试?

    最会是什么详尽的我可以为以下代码编写测试吗 public void deleteFromPerson person person person personRepository returnPerson person getId perso