2013-01-09 2 views
5

Query 클래스의 JDBI를 mockito로 모의하려고하지만 기본 클래스 SqlStatement의 메소드를 모의하지 못합니다.클래스를 조롱하는 문제

아래의 코드를 실행하면 when 문이 실제로 기본 클래스에서 구체적인 구현을 호출하고 NullPointerException으로 실패합니다.

import java.util.Map; 

import org.junit.Test; 
import org.skife.jdbi.v2.Query; 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

public class TestClass { 
    @Test 
    public void testBind() { 
     Query<Map<String,Object>> mockQuery = mock(Query.class); 
     when(mockQuery.bind("xxx", 5)).thenReturn(mockQuery); //this line fails 
     //more stuff here 
    } 
} 

은 나뿐만 아니라 EasyMock에 이것을 시도와 같은 결과를 가지고,이 방법을 조롱하는 데 실패합니다.

추가 정보 :

:

  • Mockito 버전 (dropwizard와 현재 제공되는 것)

예외는 1.9.5

  • JDBI 버전은 2.4.1이다
    java.lang.NullPointerException 
         at org.skife.jdbi.v2.SQLStatement.bind(SQLStatement.java:434) 
         at TestClass.testBind(TestClass.java:17) 
          at .... 
    

    어떤 아이디어가이 문제를 해결할 수 있습니까? 상기

  • +0

    이것은 대답이 아니지만 제 경험상 DAO 코드를 조롱하는 것은 시간 낭비입니다. JDBI API를 사용할 때 발생하는 오류는 노출되지 않습니다. 실제 데이터베이스에 대한 테스트를 작성하십시오. – artbristol

    답변

    4

    bind 방법을 시도, 그것은 그 mockito :)이 JVM (EDIT의 제한이다 무시할 수 없습니다 순간.


    EDIT2 : 점 밖으로 아래 코멘트 있음을 양지,이 위에 서면 무슨 몇 가지 오해, 이것은 나의 부분에 설명이 필요합니다

    • 는 JVM의 제한은 당신이 할 수 없음을 의미 최종 액세스로 플래그 된 유형의 서브 클래스를로드하면 최종 액세스로 플래그 된 메소드를 대체 할 수 없으며 그렇지 않으면 VerifyError가 발생합니다. mockito가을 무시할 수없는 §8.1.1.2 final classes of the Java Language Specification§8.4.3.3 final methods of the JLS§4.10 of the Java Virtual Machine Specification
    • 는 순간 Mockito는 모의 유형의 하위 클래스를 생성하는 CGLIB를 사용하기 때문에 Mockito가 현재 그 모의하기 위해 최종 클래스 또는 최종 방법을 극복 할 수없는 것을 의미한다. 그러나 을 극복하기위한 다른 전략이 있으므로을 극복하여 다른 프레임 워크 (예 : PowerMock 또는 JMockit)에서 수행 할 수 있습니다. 하지만,

    옵션은 당신이 그 상호 작용을 스텁 할 필요가 없습니다 귀하의 디자인을 변경, 또는 당신은 클래스의 바이트 코드 (나의 선호 된 접근을 다시 작성하는 클래스 로더와 트릭을 복잡하게 사용 PowerMock을 사용해야합니다 PowerMock은 기술적으로 인상적입니다.)

    희망이 있습니다.

    +1

    으로 추가되었습니다. PowerMock에서 지원하는 Mammito의 제한 사항이며, JVM이 아니라 사용자 자신의 의견을 암시합니다. JMockit *도 "클래스 로더와 함께 복잡한 트릭을 사용하지는 않지만"지원합니다. –

    +0

    @Rogerio 편집보기 : "그 순간에 모키토는 우회 할 수 없다" – Brice

    +1

    나는 그것을 보았다. 공식 Mockito 문서 [http://code.google.com/p/mockito/wiki/FAQ]조차도 JVM의 제한 사항은 아닙니다. (하지만 나 자신을 되풀이하고있다.) "우회하는"목표가 있다면 PowerMockito의 코드를 통합하는 것이 좋다. (즉, 커스텀 클래스 로더를 사용하는 것이다.) 유일하게 다른 선택은'java.lang.instrument'를 사용하여 JMockit의 접근법을 사용하는 것입니다. –

    0

    SqlStatement이 (exemple SQLStatement#bind(String, int)에 대한) 최종 결과이며 당신이 그들을 Mockito를 사용하여 조롱 할 수 있도록

    Mockito.doReturn(mockQuery).when(mockQuery).bind("xxx",5); 
    
    +0

    동일한 오류가 여전히 기본 클래스 메서드를 호출합니다. – LiorH

    +0

    사용중인 예외 및 Mockito 버전을 게시 할 수 있습니까? Mockito 1.9.0 및 jdbi 2.9.4 – bstick12

    +0

    정보가 – LiorH

    관련 문제