2012-09-17 6 views
2

나는 단위 테스트를 시작할 때입니다. JUnit과 Mockito를 사용합니다. 이것은 테스트하고 싶은 한 가지 예제입니다.중첩 된 루프를 사용하여 메서드를 테스트하는 방법

public List<Person> getPeopleList(List<Aggregate<Person>> aggregateList) { 
    List<Person> resultList = new ArrayList<Person>(); 
    for (Aggregate<Person> aggregate : aggregateList) { 
     resultList.add(aggregate); 

     for (Person person : aggregate) { 
      resultList.add(person); 
     } 
    } 
    return resultList; // the result is person and aggregate list 
} 

나는 많은 방법을 시도했지만 잘 할 수 없었다. 예 :

@Test 
public void getPeopleListTest(){ 
    ClassUnderTest testedClass = new ClassUnderTest(); 

    Aggregate aggregate = mock(Aggregate.class); 
    Iterator<Aggregate<Person>> aggregateIterator = mock(Iterator.class); 
    when(aggregateIterator.hasNext()).thenReturn(true, false); 
    when(aggregateIterator.next()).thenReturn(aggregate); 

    List<Aggregate<Person>> aggregateList = mock(List.class); 

    aggregateList.add(aggregate); 

    List<Person> list = testedClass.getPeopleList(aggregateList); 

    assertEquals(1, list.size()); 
} 

감사합니다.

답변

3

나는 가능한 모든 것을 조롱하지 않을 것입니다. 테스트하고 List가 올바르게 작동한다고 가정하는 클래스 만 모의합니다.

public class Main { 
    interface Person { 
    } 

    interface Aggregate<T> extends Person, Iterable<T> { 
    } 

    public static List<Person> getPeopleList(List<Aggregate<Person>> aggregateList) { 
     List<Person> resultList = new ArrayList<Person>(); 
     for (Aggregate<Person> aggregate : aggregateList) { 
      resultList.add(aggregate); 

      for (Person person : aggregate) { 
       resultList.add(person); 
      } 
     } 
     return resultList; // the result is person and aggregate list 
    } 

    public static void main(String... args) { 
     Aggregate<Person> aggregate = mock(Aggregate.class); 
     Aggregate<Person> aggregate2 = mock(Aggregate.class); 
     Person person = mock(Person.class); 
     Person person2 = mock(Person.class); 
     when(aggregate.iterator()).thenReturn(Arrays.asList(person).iterator()); 
     when(aggregate2.iterator()).thenReturn(Arrays.asList(person2).iterator()); 

     List<Person> list = getPeopleList(
       Arrays.asList(aggregate, aggregate2)); 
     System.out.println(list); 
     System.out.println("size: " + list.size()); 
    } 
} 

인쇄

당신이 테스트를 위해 노력하고 있다는 것이 무엇인지 스스로에게 물어 필요
[Mock for Aggregate, hashCode: 2037567902, Mock for Person, hashCode: 1629493852, Mock for Aggregate, hashCode: 44220373, Mock for Person, hashCode: 182467149] 
size: 4 
+1

'집계 '과 '사람'을 조롱하는 특별한 이유가 있습니까? 내 눈에는 이것이 필요하지 않습니다. –

+1

테스트 대상에 따라 다릅니다. 이러한 인터페이스에 대한 가정없이 메소드를 테스트하려면 모의해야합니다. 자신이 올바르게 행동하면 자신을 모의 할 필요가 없습니다. –

+0

모든 응답을 주셔서 감사합니다. 'Aggregate '과'Person'을 모의하고 싶습니다. 나는 회선을 이해한다고 생각한다 :'when (aggregate.iterator()) thenReturn (Arrays.asList (person) .iterator());''Aggregate' iterator가 호출되면'Person'의 반복자를 반환한다. 그러나 집계와 사람의 수를 어떻게 바꿀 수 있습니까? 예를 들어 확인하고 싶습니다. 2 명과 2 명. 나는 이것을 어떻게하는지 모른다. – LancerX

3

? 예제 함수에서 함수에 집계 목록이 주어 졌을 때 집합과 사람의 혼합 된 병합 목록을 반환하는지 확인하려고합니다. 당신은 당신이하고자 인수 목록에있는 모든 항목을 반복하는 방법을 변경하는 경우 그렇지 않으면

Aggregate aggregate = new Aggregate(...); 
//add persons to aggregate. 

List<Aggregate<Person>> aggregateList = new ArrayList(); 
aggregateList.add(aggregate); 

List<Person> list = testedClass.getPeopleList(aggregateList); 
assertEquals(Collections.singletonList(aggregate), result); 

:

그래서, 모의하지 목록 것 대신 예상되는 모든 항목을 포함 않는 결과 목록을 확인 테스트를 업데이트해야합니다. 테스트 할 수

또 다른 일 :

  1. 목록 인수로 주어진이 수정되지 않습니다.
  2. 인수는 null 인수를 확인합니다.

    Preconditions.checkNotNull(aggregateList, "AggregateList cannot be null"); 
    
  3. 빈 인수의 결과는 빈 결과가됩니다.

관련 문제