2015-08-07 1 views
0

Я создал макет объекта с использованием EasyMock и PowerMock. Когда я устанавливаю ожидаемое поведение метода getBigDecimal (""), он возвращает null.Junit EasyMock, resultSet.getBigDecimal ("") возвращает значение null

@Test 
public void getProductPriceContractInfo_v1_1Test() throws Exception{ 

    GetSPDProductPricePersistor productPricePersistor = new GetSPDProductPricePersistor(); 
    ProductPriceAndContractRequest_v1_1 productPriceAndContractRequest = new ProductPriceAndContractRequest_v1_1(); 
    /* set all request parameters in productPriceAndContractRequest --- */ 

    PowerMock.mockStatic(DataSourceManager.class); 
    DataSourceManager dBAccessor = PowerMock.createMock(DataSourceManager.class); 
    EasyMock.expect(DataSourceManager.getInstance()).andReturn(dBAccessor).anyTimes(); 
    EasyMock.expect(DataSourceManager.freeConnection((Connection)EasyMock.anyObject(), EasyMock.anyObject(), 
      EasyMock.anyObject())).andReturn(true); 

    Connection connection = EasyMock.createMock(Connection.class); 
    PreparedStatement ps = EasyMock.createMock(PreparedStatement.class);  

    EasyMock.expect(dBAccessor.getConnection(EasyMock.anyString())).andReturn(connection).anyTimes();  

    connection.close(); 
    connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 
    EasyMock.expect(connection.prepareStatement((String)EasyMock.anyObject())).andReturn(ps); 

    ResultSet rs = EasyMock.createMock(ResultSet.class); 
    EasyMock.expect(rs.next()).andReturn(true); 
    EasyMock.expect(rs.next()).andReturn(false); 
    EasyMock.expect(rs.getString("")).andReturn("Y").times(4); 
    EasyMock.expect(rs.getBigDecimal("")).andReturn((BigDecimal) EasyMock.anyObject()).anyTimes(); 
    EasyMock.expect(rs.getBigDecimal("")).andReturn((BigDecimal) EasyMock.anyObject()).anyTimes(); 
    EasyMock.expect(rs.getBigDecimal((""))).andReturn((BigDecimal) EasyMock.anyObject()).anyTimes(); 
    EasyMock.expect(rs.getDate("")).andReturn((java.sql.Date) EasyMock.anyObject()).anyTimes(); 
    EasyMock.expect(rs.getBigDecimal("")).andReturn(BigDecimal.TEN).anyTimes(); 
    EasyMock.expect(rs.getBigDecimal("")).andReturn((BigDecimal) EasyMock.anyObject()).anyTimes(); 
    EasyMock.expect(rs.getBigDecimal("")).andReturn(BigDecimal.valueOf(987654L)).anyTimes(); 
    EasyMock.expect(rs.getInt("")).andReturn(5).anyTimes(); 
    EasyMock.expect(rs.getString("")).andReturn("").anyTimes(); 
    EasyMock.expect(rs.getString("")).andReturn("").anyTimes(); 
    EasyMock.expect(rs.getString("")).andReturn("").anyTimes(); 

    EasyMock.expect(ps.executeQuery()).andReturn(rs); // returning ResultSet   
    EasyMock.expect(ps.executeQuery()).andReturn(rs); 


    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.setString(EasyMock.anyInt(),String.valueOf(EasyMock.anyInt())); 
    ps.close(); 

    PowerMock.expectLastCall().anyTimes(); 

    PowerMock.replay(DataSourceManager.class); 
    PowerMock.replay(dBAccessor); 
    EasyMock.replay(connection); 
    EasyMock.replay(ps); 
    EasyMock.replay(rs); 


    ProductPriceAndContractResponse_v1_1 response = (ProductPriceAndContractResponse_v1_1)productPricePersistor.getProductPriceContractInfo_v1_1(productPriceAndContractRequest); 
    assertNotNull(response); 
} 

Когда я его отладки,

public BaseResponse getProductPriceContractInfo_v1_1 (parameters) { 
     Connection connection = null; 

     PreparedStatement ps = null; 

     ResultSet rs = null; 

     try { 
      connection = getConnection(ProductPricingInfoConstants.SPD_ODS_DATASOURCE_JNDI); // class method call 
      ps = connection.prepareStatement(sqlQuery.toString()); 
      ps.setString(1, custNo); 
      ps.setString(2, divNo); 
      //made changes for 14.5 CI Release--START 
      ps.setString(3, custNo); 
      ps.setString(4, divNo); //PCRD-15.2 Specialty Online Requirements-Batch I 

      int index = 5; //PCRD-15.2 Specialty Online Requirements-Batch I 

      //made changes for 14.5 CI Release--END 
      for (String cin : itmLst) { 
       ps.setString(index++, cin); 
      } 

      rs = ps.executeQuery(); 

      if (null != rs) { 
       ContractInfo contractInfo; 
       ProductPriceInfo productPriceInfo; 

       while (rs.next()) { 
        productPriceInfo = new ProductPriceInfo(); 

        String str = rs.getString("") 
        productPriceInfo.setAltProductContract(); 

        int num = rs.getInt(""); 

        BigDecimal cntrNumber = rs.getBigDecimal(""); 
        productPriceInfo.setContractNumber(cntrNumber.toString()); 
} 

я получил ожидаемую величину в num и str переменной, но получил null значение в cntrNumber переменной.

+0

Почему вы используете easyMock и powerMock, поскольку, как я вижу, вам не нужно издеваться над рядовыми или статическими? Можете ли вы добавить пример кода? –

+1

Нет смысла высмеивать объекты для теста, чтобы напрямую вызывать методы этих макетов из теста (если вы не разрабатываете Mocking API). В стороне, пожалуйста, укажите код, который печатает вывод, включая вызовы 'ResultSet', получает –

+0

. Кроме того, в коде, который вы показали, вы, кажется, не издеваетесь над любыми методами, которые возвращают' ResultSet' из 'PreparedStatement' –

ответ

2

только один ожидание getBigDecimal никогда не будет использоваться, как указано:

EasyMock.expect(rs.getBigDecimal("")).andReturn((BigDecimal) EasyMock.anyObject()).anyTimes(); 

Метод anyTimes не говорит, это может быть вызвано неопределенное количество раз и, следовательно, нет других ожиданий на getBigDecimal будет использоваться ,

Ваш тест не называет EasyMock.verify по завершении. Если бы это было сделано, тест потерпел бы неудачу, потому что ожидания не были выполнены, что подчеркивает эту проблему.

Причина getBigDecimal возвращается в null потому, что EasyMock.anyObject() возвращает null. Метод EasyMock.anyObject() не предназначен для использования в качестве возвращаемого значения, как указано в документации, он создает совпадение , которое будет соответствовать любому параметру Object, переданному методу.

В качестве альтернативы тесты, подобные этому, в значительной степени бесполезны - они просто проверяют код, вызывающий методы, указанные в тестируемом методе, и вы можете быть уверены, что Java это сделает.

Вы должны протестировать фактическую интеграцию с базой данных с помощью тестов Acceptance, которые выполняются в виде набора отдельно от ваших модульных тестов.

+0

Если я верну свое значение, как этот EasyMock.expect (rs.getBigDecimal ("")) иReturn (BigDecimal.valueOf (987654L)). AnyTimes(); его все еще возвращает нулевое значение. Можете ли вы предложить мне, каково должно быть возвращаемое значение, – Anil

+0

Вы читали бит о 'anyTimes'? Если вы сделаете первое ожидание возвратом 'BigDecimal', оно будет работать –

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