2017-11-22 15 views
0

이 코드에 대한 테스트를 작성해야합니다.SimpleJdbcCall 테스트 방법

@Autowired 
JdbcTemplate jdbcTemplate; 

public List<Row> getData(int id) { 
    // Preconditions here 

    SimpleJdbcCall getCall = new SimpleJdbcCall(jdbcTemplate) 
      .withSchemaName(SCHEMA) 
      .withProcedureName(SP) 
      .declareParameters( 
       // ... 
      ) 
      .returningResultSet("result", (RowMapper<QuestionAnswerRow>) (rs, rowNum) -> .....); 

    MapSqlParameterSource params = new MapSqlParameterSource(); 
    params.addValue("id", id); 
    // other parameters here 

    Map queryRes = getCall.execute(params); 
    List<row> res = (List<row>) queryRes.get("result"); 
    return res; 
} 

당신은 내가 여기에 Mockito와 getCall.execute(params) 응답 조롱 수있는 방법을 나에게 보여 주시겠습니까?

답변

2

여기서 문제는 메서드 내에서 전체 getCall 개체를 만드는 것이므로 어떻게 든 그 프로세스에 모의를 삽입 할 수 없다는 것입니다.

여기에 몇 가지 가능성이 있습니다

가) 당신은 조롱 할 수 jdbcTemplate 및 그 모두가 getCalljdbcTemplate로 만들 것입니다 호출 조롱에 의해 작동하도록하려고합니다. jdbcTemplate이 실제로 모든 db 작업을 수행 할 것이므로이 작업은 가능하지만 솔직히 노력하지 않아도 될 것입니다 (절대적으로 중요하지 않으므로).

b) 전체 테스트를 통합 테스트로 전환하여 예를 들어 메모리 내 db에 대해 실행할 수 있습니다. 물론 통합 테스트를 단위 테스트의 대체품으로 사용하는 것에 대해서는 여러 가지 주장이 있습니다. 따라서 아마도 이것이 최선의 방법은 아닙니다. 그것은 가능하지만 스프링 테스트 유틸리티와 주석을 사용하면 매우 간단해질 수 있습니다.

c)는이이 경우에 의미 약간의 작업, 우리 잎 리팩토링 :

문제는 내부적으로 SimpleJdbcCall을 만드는 것이 하나의 해결책은 예를 들어, 그 부분을 추출하는 것 때문에, 공장에.

@Component 
class SimpleJdbcCallFactory { 
    public SimpleJdbcCall create(JdbcTemplate template) { 
     return new SimpleJdbcCall(template); 
    } 
} 

지금 당신은 ...

@RunWith(MockitoJUnitRunner.class) 
public class YourTestClassHere { 

    @Mock 
    private SimpleJdbcCallFactory simpleJdbcCallFactory; 

    @InjectMocks 
    private YourClassHere classToTest; 

    @Test 
    public void test() { 
     SimpleJdbcCall mockedCall = Mockito.mock(SimpleJdbcCall.class); 
     Mockito.when(simpleJdbcCallFactory.create(Mockito.any())).thenReturn(mockedCall); 
     Mockito.when(mockedCall).withSchemaName(Mockito.anyString()).thenReturn(mockedCall); 
     // etc. unfortunately needed for fluent apis (unless they added those in mockito) 
     Mockito.when(mockedCall.execute(Mockito.any()).thenReturn(...); 

     classToTest.getData(123); 
    } 

} 
+2

덕분에 많이 :) – Vitalii

+0

I'를 클래스에 @Autowired 종속성을 추가 한 다음 단위 테스트에서 그 depencency을 조롱 할 수 있습니다 :이 간단한 예를 보여줍니다 이것을 시도 할 때 'no datasource specified'가 표시됩니다. jdbcTemplate을 조롱 할 수 있지만 데이터 소스는 기본적으로 null입니다. – Hinotori