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

对于下面的代码,我可以编写哪些最详尽的测试?

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

此方法位于a service类中。 该方法调用JpaRepository ,然后在实体上调用它的delete()方法。

如果无法测试实体是否被删除,是否还有其他 tests cases可以在该方法上运行?

有两种测试策略。 一个是unit testing,即确保您的服务正常运行。 另一个是集成/端到端测试,即确保一切都很好地结合在一起。

你对你拥有的东西进行unit testing,你可以集成测试你拥有的一切 这是一个非常粗略的例子,只使用你的陈述,加上一些我无法填补空白的东西。

unit testing

使用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 } 

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

集成测试

另一方面,如果要进行集成测试,则不使用模拟。 相反,您需要连接所有内容,如测试数据库和回购。 我会把它留给你,因为没有参考实施。

 @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, ie 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); } 

在这种情况下,您需要确保您的repo实际处理来自服务的所有调用。 您知道您的服务是通过unit testing工作的,但是repo是从服务工作还是您配置错误