a3dsfcv:
Suponha que eu tenho classe Formater
class Formatter {
public FormattedData format(Map<String, Data> data) {
return .....
}
}
e outra classe Collector
que usa Formatter
e pode retornar dados formatados
class Collector {
Formatter formatter;
Map<Id, Data> map = new HashMap<>()
class Collector (Formatter formatter) {
this.formatter = formatter;
}
public void addData(Data data) (
map.put(data.getId(), data);
}
public FormattedData getFormattedData() {
return formatter.format(map)
}
Portanto, o problema - eu quero testes de escrita. Eu escrevi todos os testes para Formatter
classe, mas como eu deveria teste Collector
?
Desde que eu não deve confiar em implementação de colecionador - Eu preciso copiar todos os testes para Formatter
e passá-los como entrada para Collector
. Certamente nos testes que eu mudaria Map<String, Data> data
a Data data
como o tipo de dados de entrada, mas de qualquer maneira, haverá uma enorme duplicação de código. Como posso evitá-lo?
prato:
Você usar simulações para que você não dependem da implementação do formatador.
@Test
@ExtendWith(MockitoExtension.class) // @RunWith(MockitoJUnitRunner.class) for JUnit 4
class CollectorTest {
@InjectMocks
private Collector sut;
@Mock
private Formatter formatter;
public FormattedData getFormattedData() {
FormattedData formatted = mock(FormattedData.class);
when(formatter.format(any()).thenReturn(formatted);
FormattedData result = sut.getFormattedData();
// verify injected formatter was called
verify(formatter).format(any());
// verify the result of the formatter is returned by the collector
assertThat(result).isSameAs(formatted);
}
}