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);
}
}