Как выполнить модульное тестирование DAO, расширяющего SqlMapClientDaoSupport - PullRequest
5 голосов
/ 21 сентября 2008

Spring DA помогает в написании DAO. При использовании iBATIS в качестве каркаса постоянства и расширении SqlMapClientDaoSupport для DAO должен быть установлен макет SqlMapClient, но я не могу этого сделать. SqlMapClientTemplate не является интерфейсом, и EasyMock не может создать для него макет.

Ответы [ 4 ]

1 голос
/ 16 июня 2010

Как подсказал @Banengusk - этого можно достичь с помощью Mockito . Тем не менее, важно установить, что ваш DAO будет использовать Spring SqlMapClientTemplate, который оборачивает ваш макет SqlMapClient Infact, SqlMapClientTemplate делегирует вызовы SqlMapSession в слое IBatis.

Поэтому требуется дополнительная настройка макета:

mockSqlMapSession = mock(SqlMapSession.class);
mockDataSource = mock(DataSource.class);

mockSqlMapClient = mock(SqlMapClient.class);
when(mockSqlMapClient.openSession()).thenReturn(mockSqlMapSession);
when(mockSqlMapClient.getDataSource()).thenReturn(mockDataSource);

dao = new MyDao();
dao.setSqlMapClient(mockSqlMapClient);

Затем мы можем проверить поведение следующим образом:

Entity entity = new EntityImpl(4, "someField");
dao.save(entity);

ArgumentCaptor<Map> params = ArgumentCaptor.forClass(Map.class);
verify(mockSqlMapSession).insert(eq("insertEntity"), params.capture());
assertEquals(3, params.getValue().size());
assertEquals(Integer.valueOf(4), params.getValue().get("id"));
assertEquals("someField", params.getValue().get("name"));
assertNull(params.getValue().get("message"));
1 голос
/ 26 сентября 2008

Именно по этой причине я не расширяюсь от SqlMapClientDaoSupport. Вместо этого я вставляю зависимость в SqlMapClientTemplate (тип интерфейса SqlMapClientOperations) Вот пример Spring 2.5:

@Component
public class MyDaoImpl implements MyDao {

    @Autowired
    public SqlMapClientOperations template;

    public void myDaoMethod(BigInteger id) {
        int rowcount = template.update("ibatisOperationName", id);
    }
}
1 голос
/ 21 сентября 2008

DAO и юнит-тесты плохо ладят! Не имеет смысла что-либо делать в компоненте, который не содержит бизнес-логики и ориентирован на доступ к базе данных. Вместо этого вы должны попробовать написать интеграционный тест. Посмотрите на справочную документацию на пружину, глава 8.3: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html

0 голосов
/ 21 сентября 2008

Попробуйте Мокито . Это позволяет имитировать классы, а не только интерфейсы.

...