有两种测试策略。一种是单元测试,即确保您的服务正常工作。另一个是集成/端到端测试,即确保一切都很好地结合在一起。
你对你拥有的东西进行单元测试,你对你拥有的一切进行集成测试。这是一个非常粗略的示例,仅使用您的陈述,加上一些我无法填补空白的虚构内容。
单元测试
使用 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
}
是的,这个测试看起来是死板的,但无论如何,这就是你在单元测试中测试的全部内容。您希望 DB 使用参数从数据库中获取 Person,因此有两个 Person 对象,并且您希望删除传递的 Person 对象,这就是您期望调用的原因。简单的方法产生简单的测试。您基本上希望确保您按预期与存储库进行交互。存储库在实际实现中可能会损坏或为空,但这不会改变您的服务已正确实现的事实。
集成测试
另一方面,如果您想进行集成测试,则不使用模拟。相反,您需要连接 test DB 和 repo 等所有内容。由于没有实施参考,因此由您决定。
@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);
}
在这种情况下,您要确保您的 repo 实际处理来自服务的所有调用。您知道您的服务在单元测试中有效,但 repo 是否在服务中有效,或者您是否配置了错误