2017-11-22 1 views
1

verify의 Mockito의 JavaDocs 메소드는 this interesting article에 대한 질문과 대답에 링크되어 있습니다. 나는 특별히 "stubbed 상호 작용 가 암시 적으로 확인 된"으로 약간 잃어 버렸습니다.Mockito 상호 작용 확인 결과 확인

  • HQL 쿼리가 제대로 구성되었는지 :의 나는이 방법에 대해 확인할 수있는 것을 보자, 이제이 클래스

    class FooDao { 
        private EntityManager entityManager; 
    
        public FooDao(EntityManager entityManager) { 
         this.entityManager = entityManager; 
        } 
    
        public List<Foo> findFooByName(String name, String otherParam) { 
         String hql = "SELECT f FROM Foo f WHERE 1 = 1 "; 
         if(name != null) { 
          hql += " AND f.name = :name"; 
         } 
         if(otherParam != null) { 
          hql += " AND f.other = :otherParam"; 
         } 
         TypedQuery<Foo> query = this.entityManager.createQuery(hql, Foo.class); 
    
         if(name != null) { 
          query.setParameter("name", name); 
         } 
         if(otherParam != null) { 
          query.setParameter("otherParam", otherParam); 
         } 
         return query.getResultList(); 
        } 
    } 
    

    가 상상 :

    의 예로 들어 보자 주어진 매개 변수에 대해.

  • 매개 변수가 쿼리 개체에 올바르게 바인딩되어 있습니다.
  • 그 결과는 내가 기대하는 것입니다.

먼저 실제 데이터베이스에 액세스하고 싶지 않기 때문에 EntityManager 개체를 조롱합니다.

@InjectMocks 
private FooDao dao; 

@Mock 
private EntityManager entityManager; 

지금, 나는 그냥이 같은 것을 추가 할 수

@Mock 
private TypedQuery<Foo> mockQuery; 

@Test 
public void testFindFooByName() { 
    List<Foo> stubData = stubData(); // Method definition omitted for brevity 
    // Return the custom mockedQuery with the entityManager 
    Mockito.when(mockQuery.getResultList()).thenReturn(stubData); 
    Mockito.when(entityManager.createQuery(Mockito.anyString(), 
        Mockito.eq(Foo.class))) 
      .thenReturn(mockQuery); 
    List<Foo> actual = dao.findFooByName("foobar", null); 

    // Now what should I check? 
} 

그래서, 지금 문제는 확인하는 것입니다. assertEquals(stubData, actual)을 추가하면 테스트가 성공적으로 완료됩니다.

또한 추가 할 수 있습니다

Mockito.verify(entityManager).createQuery(expectedSql, Foo.class); 
Mockito.verify(mockQuery).setParameter("name", "foobar"); 

첫 번째 검증은 HQL 쿼리가 제대로 구축되어 있는지 확인하고 두 번째 매개 변수가 올바르게 쿼리에 바인딩되었는지 확인합니다. 이러한 검증이 필요합니까 아니면 결과만으로 충분하다고 주장합니까?

+0

이에 혼란을 추가 여부를 결정, 코드 커버리지 번호를 검토하는 것은 내가 –

답변

1

당신은 findFooByName()setParameter() 또는 getQueryList()

스텁 또는 query.getResultList() 호출이 어떻게 특정 내려 오는 확인하는 여부에 대한 선택을 호출 할 때, 그렇지 않으면 테스트가 NPE가 슬로우 것이기 때문에 entityManager와의 상호 작용을 스텁해야 당신

최소 특정

다음 테스트는방법에 대한 비 특이 ... 테스트가되고 싶어이 생성되고 대신 이라는 것을 자체적으로 충족하므로이 생성되고 해당 getResultList() 메서드가 호출됩니다.

@Test 
public void testFindFooByName() { 
    List<Foo> stubData = stubData(); 

    Mockito.when(entityManager.createQuery(Mockito.anyString(), Mockito.eq(Foo.class))).thenReturn(mockQuery); 

    dao.findFooByName("foobar", null); 

    Mockito.verify(mockQuery).getResultList(); 
} 

더 구체적인

다음 테스트는 TypedQuery 만드는 방법에 대한 비 특정 대신 어떻게 든가 만든 것을 확인하고 그 getResultList() 호출의 결과는 방법으로 반환됩니다 - 시험 삼아.결과는 내가 무엇을 기대하는지

:

@Test 
public void testFindFooByName() { 
    List<Foo> stubData = stubData(); 

    Mockito.when(mockQuery.getResultList()).thenReturn(stubData); 
    Mockito.when(entityManager.createQuery(Mockito.anyString(), Mockito.eq(Foo.class))).thenReturn(mockQuery); 

    List<Foo> actual = dao.findFooByName("foobar", null); 

    Assert.assertSame(stubData, actual); 
} 

대부분 특정

다음 테스트는 (당신의 OP에서) 다음의 모든 사항을 증명한다.

매개 변수가 쿼리 개체에 올바르게 바인딩되어 있습니다.

주어진 매개 변수에 대해 HQL 쿼리가 올바르게 구성되었는지 확인하십시오.

@Test 
public void testFindFooByName() { 
    String name = "foobar"; 
    String otherParam = "otherParam"; 

    String expectedHql = "SELECT f FROM Foo f WHERE 1 = 1 AND f.name = :name AND f.other = :otherParam"; 

    List<Foo> stubData = stubData(); 

    Mockito.when(mockQuery.getResultList()).thenReturn(stubData); 
    Mockito.when(entityManager.createQuery(Mockito.eq(expectedHql), Mockito.eq(Foo.class))).thenReturn(mockQuery); 

    List<Foo> actual = dao.findFooByName(name, otherParam); 

    Assert.assertSame(stubData, actual); 

    Mockito.verify(mockQuery).setParameter("name", name); 
    Mockito.verify(mockQuery).setParameter("otherParam", otherParam); 
} 

그래서, 요약, 검증 또는 스텁 상호 작용이나 가능성 고려할를 모두 포함할지 여부를 결정할 때 :

  • 코드 테스트 대상은 무엇을 :
    • 중지 된 실행을 막기 위해 스텁이 필요할 수 있습니다.
    • 위임자 이외의 작업을 수행하는 방법은 다음을 사용하여 적절하게 입증 될 수 있습니다. 검증
    • 모의의 응답을 변환하는 방법은 가능성이 변환 된 응답에 대한 주장 뒤에 스텁 필요
    • 등 당신이 당신의 테스트 케이스가되고 싶어요 어떻게 특정
  • :
    • 일부 테스트 경로는 전체 범위를 제공하기 위해 확인해야합니다.
    • 스텁 및 검증이 과도 할 수 있습니다. 추가 확인 전화가 혜택을 추가하거나 당신의 테스트 케이스
+0

생각하여 정성 들여 답변을 주셔서 감사 의견의 문제입니다! 그렇다면 이러한 종류의 테스트를 작성하는 기준이나 패턴이 있습니까? 아니면 사례별로 분석해야합니까? – lordscales91

+0

"스텁 된 상호 작용이 암시 적으로 확인되었습니다"하지만 여기에는 표준 패턴이 없다고 생각합니다. 확실히 좋은 시작입니다. 그것은 당신이 느끼는 것입니다. – glytching