a3dsfcv :
나는 클래스가 있다고 가정 Formater
class Formatter {
public FormattedData format(Map<String, Data> data) {
return .....
}
}
다른 클래스 Collector
용도는 것을 Formatter
반환 할 수있는 데이터 포맷
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)
}
문제 그래서 - 나는 쓰기 시험을합니다. 나는 모든 테스트 쓴 Formatter
클래스를,하지만 어떻게 시험해야 Collector
?
내가 컬렉터의 구현에 의존해서는 안 때문에 - 나는 모든 테스트를 복사해야합니다 Formatter
및 입력으로 전달할 Collector
. 확실히 테스트에서 내가 바꿀 것 Map<String, Data> data
에 Data data
입력 데이터 형식으로, 어쨌든 거대한 코드 중복이있을 것이다. 어떻게 그것을 피할 수 있습니까?
요리 :
당신이 포맷터 구현에 의존하지 않는, 그래서 당신은 모의 객체를 사용합니다.
@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);
}
}