2013-04-04 3 views
1

Когда я пытаюсь выполнить модульный тест следующего класса, расширяющего StoredProcedure, я получаю исключение NullPointerException в строке: return (Map) execute(csc, new CallableStatementCallback() в классе JDBCTemplate. Я издевался над bean-компонентом, который передается в методе execute, DataSource и sql.Тестирование модуля класса Java, поддерживающего сохраненную процедуру с помощью EasyMock

public class MyStoredProc extends StoredProcedure { 
    /** 
    * Constructor - sets SQLParameters for the stored procedure. 
    * 
    * @param ds - DataSource 
    */ 
    public MyStoredProc(DataSource dataSource, String sql) { 
     super(dataSource, sql); 
     declareParameter(new SqlOutParameter("return",Types.NUMERIC)); 
     declareParameter(new SqlParameter("BATCH_ID",Types.NUMERIC)); 
     declareParameter(new SqlParameter("PROCESS_TYPE",Types.VARCHAR)); 

     complie(); 
    } 

    public BigDecimal execute(MyBean bean){ 
     BigDecimal returnValue = BigDecimal.valueOf(-1); 

     Map in = new HashMap(); 

     in.put("BATCH_ID", bean.getBatchID()); 
     in.put("PROCESS_TYPE", bean.getProcessType()); 

     Object obj = execute(in); 
     if (obj != null) { 
      Object output = ((HashMap) obj).get("return"); 

      if(output instanceof BigDecimal) { 
       returnValue = (BigDecimal)output; 
      } 
     } 
     return bigDec; 
    } 
} 

тест: P.S - Когда я отлаживать этот тестовый случай, StoredProcedure издеваться не используется в all.Instead используется фактическая реализация.

public class MyStoredProcTest { 
private MyStoredProc mysp; 
private DataSource dataSource; 
private String sql; 
@Before 
public void setUp() { 
    dataSource = EasyMock.createMock(DataSource.class); 
    sql = "Testing"; 
    mysp = new MyStoredProc(dataSource, sql); 
} 

@Test 
public void testExecute() { 

    StoredProcedure storedProcedure = EasyMock 
      .createMock(StoredProcedure.class); 
    HashMap map = new HashMap(); 
    map.put("return", BigDecimal.ONE); 
    expect(storedProcedure.execute(EasyMock.anyObject(Map.class))).andReturn(map); 

    Connection con = EasyMock.createMock(Connection.class); 
    expect(dataSource.getConnection()).andReturn(con); 
    MyBean bean = EasyMock.createMock(MyBean.class); 


    expect(bean.getBatchID()).andReturn(BigDecimal.valueOf(.0001)) 
      .anyTimes(); 
    expect(bean.getProcessType()).andReturn("Process Type").anyTimes(); 

    replay(bean, dataSource, storedProcedure, con); 
    BigDecimal returnValue = null; 
    try { 
     returnValue = mysp.execute(bean); 
    } catch (Exception e) { 
     System.out.println("exception" + e.getStackTrace());// the Null pointer from JDBCTemplate is caught here. 
    } 
    Assert.assertEquals(BigDecimal.valueOf(-1), returnValue); 
} 
+0

Можете ли вы опубликовать тест? – 2013-04-04 20:55:19

+0

тестовый случай отправлен – ShilR

ответ

0

Некоторые из ваших издевательств не используются, потому что вы их не воспроизводите. Вы должны изменить replay(bean) на replay(bean, datasource, storedProcedure)

С другой стороны, map не нужно издеваться. Когда вы ожидаете звонок до storedProcedure.execute(...), вы можете вернуть предварительно заполненный map.

+0

Спасибо jradakov ... Я все еще получаю ту же ошибку. Я добавил повтор, создал экземпляр карты вместо издевательства над вашим предложением и добавил макет для подключения (так как это дало мне неожиданный вызов getConnection) – ShilR

+0

Я забыл добавить «con» для воспроизведения ... сделал это и получил другую ошибку сейчас ... попытается разрешить его и опубликовать, если нужна какая-либо помощь – ShilR

Смежные вопросы