조성 클래스에 대한 테스트를 작성하기위한 가장 좋은 방법은 무엇입니까

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

추천

출처http://10.200.1.11:23101/article/api/json?id=478649&siteId=1