2017-01-21 2 views
0

Я пытаюсь реализовать EasyMock 3.4 в проекте Java Spring. Успешно издевался над всем объектом и тестировал классы, кроме DAO, который использует JDBCTemplate.EasyMock on Spring jdbcTemplate всегда возвращает нуль, а не насмешливый объект

@RunWith(EasyMockRunner.class) 
public class DummyDAOImplTest extends EasyMockSupport { 

    @TestSubject 
    private DummyDAOImpl dummyDAOImpl = new DummyDAOImpl(); 

    JdbcTemplate jdbcTemplateObject; 

    @Before 
    public void setUp(){ 
     jdbcTemplateObject = EasyMock.createNiceMock(JdbcTemplate.class);  
     dummyDAOImpl.setJdbcTemplate(jdbcTemplateObject); 
    } 

    @Test 
    public void testGetApplicationConfigValueReturnNonNull(){ 
     String query = "SELECT value FROM application_configuration WHERE tag=?"; 
     String tag = "REFRESH_INTERVAL"; 
     EasyMock.expect(jdbcTemplateObject.queryForObject(query,new Object[] {tag}, String.class)).andReturn("12"); 
     EasyMock.replay(jdbcTemplateObject); 
     Assert.assertEquals(12,dummyDAOImpl.getApplicationConfigValue(tag)); 
    } 
} 


public class ConfigurationDAOImpl implements ConfigurationDAO { 

    private JdbcTemplate jdbcTemplateObject; 

    @Override 
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
     this.jdbcTemplateObject = jdbcTemplate; 
    } 

    @Override 
    public int getApplicationConfigValue(String tag) { 
     String query = "SELECT value FROM application_configuration WHERE tag=?"; 
     String refreshTime = jdbcTemplateObject.queryForObject(query,new Object[] {tag}, String.class); 
     if(refreshTime != null && !"".equals(refreshTime)) 
      return new Integer(refreshTime); 
     else 
      return 0; 
    } 
} 

Хотя в методе testGetApplicationConfigValueReturnNonNull - Я пытаюсь дразнить его, чтобы вернуться 12, но она всегда возвращает нуль.

Первый раз, когда я внедряю EasyMock, все, что у меня отсутствует, как я уже пробовал и не смог его взломать!

С наилучшими пожеланиями, Сундаром

ответ

1

Фактически, ваша единственная проблема - ваша линия ожидания. Он должен быть

EasyMock.expect(jdbcTemplateObject.queryForObject(eq(query), aryEq(new Object[] {tag}), eq(String.class))).andReturn("12"); 

По умолчанию EasyMock выполнит equals от параметра, чтобы соответствовать ожиданиям. Дело в том, что для массива нет equals. Поэтому вам нужно указать совпадение для массива (aryEq). И как только у вас есть собеседник, вы должны иметь один для всех (по техническим причинам).

Полный код с некоторыми упрощениями приведен ниже.

  1. Я предположил, что это ConfigurationDAO, что вы хотите проверить
  2. Вы можете replayAll, так как вы расширяете EasyMockSupport
  3. Вы можете использовать @Mock из бегуна
  4. Вам не нужен хороший макет. На самом деле, не использовать его здесь, показали хорошее исключение о неожиданном вызове, который был бы действительно полезно для вас
  5. Фиктивный теперь также впрыскивается в EasyMockRunner
  6. Я предпочитаю, чтобы добавить verifyAll в конце большинство моих тестов. Он уверен, что все ожидания были использованы
  7. Статический импорт, потому что я думаю, что это понятнее читать

Код:

import static org.easymock.EasyMock.*; 
import static org.junit.Assert.*; 

@RunWith(EasyMockRunner.class) 
public class DummyDAOImplTest extends EasyMockSupport { 

    @TestSubject 
    private ConfigurationDAOImpl dao = new ConfigurationDAOImpl(); 

    @Mock 
    JdbcTemplate jdbcTemplateObject; 

    @Test 
    public void testGetApplicationConfigValueReturnNonNull(){ 
    String query = "SELECT value FROM application_configuration WHERE tag=?"; 
    String tag = "REFRESH_INTERVAL"; 

    expect(jdbcTemplateObject.queryForObject(eq(query), aryEq(new Object[] {tag}), eq(String.class))).andReturn("12"); 

    replayAll(); 

    assertEquals(12, dao.getApplicationConfigValue(tag)); 

    verifyAll(); 
    } 
} 
+0

Анри - спасибо много помощнику, и это объясняет многое, где я ошибался, но все еще не могу понять, зачем мне это нужно. Любой документ или ссылку, чтобы пройти и узнать больше об этом? Поскольку я использовал ту же технику @Mock для класса обслуживания и все отработанные ожидали для классов DAO .. Сказал, что, делая подобное изменение, мой jdbctemplate.update не работает сейчас: (не уверен, как отформатировать код здесь, поскольку я не использую для публикации вопросы много .. – Sundar

+0

@Test общественного недействительными updateDashboardAppRefreshConfigurationTest() { Строка запроса = "значение UPDATE application_configuration SET = WHERE тег =?"; конфигурации конфигурации = новая конфигурация(); config.setTag (ApplicationConstant.DASHBOARD_APP_REFRESH_INTERVAL. getValue()) ;; config.setRefreshInterval (20); expect (jdbcTemplateObject.update (eq (query), aryEq (новый Object [] {config.getRefreshInterval(), config.getTag()}))) иReturn (0); replayAll(); assertEquals (0, configurationDAOImpl.updateConfiguration (config)); verifyAll(); } – Sundar

+0

Документация находится здесь http://easymock.org/user-guide.html. Если что-то не хватает, скажите мне. Мне нужна ошибка, чтобы узнать, что случилось. И я не думаю, что мы можем форматировать комментарий. Если вы хотите быть более гибкими по своим параметрам, вы можете использовать 'anyObject()' matcher. – Henri

0

Возможно, вам нужно загрузить из контекста Весна

@ContextConfiguration(locations = "classpath:application-context-test.xml") 
@RunWith(EasyMockRunner.class) public class DummyDAOImplTest extends EasyMockSupport { ... 

переопределять-контекст области применения, как этот

контекста приложения-test.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx/ http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"><import resource="application-context.xml"/><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="jdbc:your-db-conection" /> 
    <property name="username" value="" /> 
    <property name="password" value="" /> 

+0

, если я делаю что его работы даже без фиктивных объектов, как контекст имеет мой конфигурация базы данных. Но я хочу сделать свой тестовый случай независимым от базы данных. SO только отправился на макет объектов, где я могу издеваться над возвратом объекта данных вместо фактического вызова БД. – Sundar

+0

Обновлено выше ..Идея заключается в создании нового тестового контекста, который импортирует исходный контекст и переопределяет ваш источник данных. Надеюсь, это поможет – jonhid

+0

Интересно .. У меня уже есть отдельный тестовый контекст. Но разве это еще не зависит от БД ..? Я вижу, что вы упомянули HSQLDB .. вы имели в виду внутреннюю временную БД? - Спасибо за ваш ответ и предложения. Цените это! – Sundar

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