2016-06-28 2 views
2

Что было бы самым исчерпывающим тестами, которые я мог бы написать для следующего фрагмента кода?Junit: написание теста для метода, который удаляет объект?

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

Этот метод находится в пределах a service класса. Метод вызывает вызовы JpaRepository, которые затем называет его методом delete().

Если невозможно проверить, удаляется ли объект, есть ли какие-либо другиеtests cases Я могу работать по методу?

+0

Вы можете проверить это, извлекая объект человека, убедившись, что он успешно извлечен, а затем удалил его и попытался найти снова. Если вы не можете получить его во второй раз, удаление будет успешным. –

+1

* Если невозможно проверить, удаляется ли объект * Если вы пишете единичный тест, то ответственность за тест заключается в том, чтобы вызвать метод 'personRepository.delete', а не то, что он действительно работает. Если вы пишете тест интеграции, вы должны создать «Лицо», проверить его существование, а затем удалить его и проверить его несуществование. – Compass

+0

Также проверьте, что удаление неверного идентификатора или действительного идентификатора дважды выполняется, как вы ожидаете. – walsht

ответ

5

Существует две стратегии тестирования. Один - это модульное тестирование, то есть убедитесь, что ваш сервис работает. Другое - интеграция/сквозное тестирование, то есть убедитесь, что все играет хорошо вместе.

Вы испытываете материал, который у вас есть, вы интегрируете все, что у вас есть. Это довольно грубый пример, использующий только ваше заявление, плюс некоторые составленные вещи, где я не могу заполнить пробелы.

модульных тестов

Использование 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, и вы ожидаете удалить прошедший 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, 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); 
} 

В этом случае вы хотите, чтобы ваше репо фактически обрабатывало все вызовы службы. Вы знаете, что ваша служба работает с модульным тестом, но работает ли репо с сервисом или вы что-то не правильно настроили.

+0

Благодарим вас за пример, можете ли вы, пожалуйста, быстро переписать, что будет в примере с использованием Mockito, я никогда не использовал простой макет, поэтому считаю его довольно запутанным? – java123999

+0

Добавлено грубое представление о том, что Мокито будет. Синтаксис должен быть очень схожим, если вы переключитесь на EasyMock, если знаете Mockito. – Compass

Смежные вопросы