2016-07-15 2 views
0

Я хочу написать модульный тест для одного из моих сервисов, чтобы проверить, что определенные поля назначены.Как выполнить модульное тестирование службы, которая устанавливает атрибут только что созданного объекта

public void createNewRecord(Dto dto) { 
    Record record = new Record(); 
    record.setName(dto.getName()); 
    record.setDetail(dto.getDetail()); 
    repo.save(record); 
} 

Я не конструктор для DTO, потому что запись имеет много атрибутов, и некоторые из них получить назначение от других методов. Мой предыдущий план: mock the record и проверка setName() и setDetail методы вызывается один раз. Но в эту услугу нет способа ввести в заблуждение запись. Должен ли я изменить свой предыдущий код? Любую мысль оценивают.

ответ

1

Есть несколько подходов:

Первый: метод

изменения этого

public void createNewRecord(Record record, Dao dao) 

Второй:

Использование PowerMockito издеваться конструктору

Третье:

Используйте завод или com.google.inject.Provider для конструкта записи (я предпочитаю это)

Forth:

Если запись конструктор является простым и сеттеры для записи также не имеют специальной логики, тогда вы можете высмеивать только репо и проверять аргумент репо.

0

Mocks следует использовать для издевательств над зависимым объектом, а не для издевательств над внутренним объектом в тестируемом методе. Почему вы не издеваетесь над экземпляром репо, и тогда вы проверите с вами mock api, что repo.save() вызывается с ожидаемой записью? Кажется, это простой способ модульного тестирования вашего метода.

0

Вы можете использовать Mockito и свою аннотацию @Captor, чтобы записать аргументы, переданные в экземпляр repo. Вы можете @Mock на Dto объект для создания ожидания для getName() и getDetail() методов и утверждать, что результаты вызова на setName() и setDetail() методы захваченного Record например те же значение, ожидаемое от Dto объекта. Например:

@Mock 
private Repo repo; 

@Mock 
private Dto dto; 

@Captor 
private ArgumentCaptor<Record> recordArgumentCaptor; 

private Service service; 

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    this.service = new Service(repo); 
} 

@Test 
public void shouldCreateNewRecord() { 
    when(dto.getName()).thenReturn("NAME"); 
    when(dto.getDetail()).thenReturn("DETAIL"); 

    service.createNewRecord(dto); 

    verify(repo).save(recordArgumentCaptor.capture()); 
    Record record = recordArgumentCaptor.getValue(); 

    assertThat(record.getName(), is(equalTo(dto.getName()))); 
    assertThat(record.getDetail(), is(equalTo(dto.getDetail()))); 
} 

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

  • Нет связанных вопросов^_^