Как к модульному тесту ДАО, который расширяет SqlMapClientDaoSupport

Обновление:

Для версий mongodb 2.2+ более эффективный способ сделать это, описанный @JohnnyHK в другом ответе .

1.Использование $, где

db.accommodations.find( { $where: "this.name.length > 1" } );

Но ...

Javascript выполняется медленнее, чем исходные операторы, перечисленные на этой странице, но очень гибкая. См. Страницу обработки на стороне сервера для получения дополнительной информации.

blockquote>

2.Создайте дополнительное поле NamesArrayLength, обновите его длиной массива имен и затем используйте в запросах:

db.accommodations.find({"NamesArrayLength": {$gt: 1} });

Это будет лучшее решение и будет работать намного быстрее (вы можете создать на нем индекс).

5
задан Behrang 21 September 2008 в 09:06
поделиться

4 ответа

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

1
ответ дан 15 December 2019 в 06:38
поделиться

Эта точная причина состоит в том, почему я не расширяюсь от 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
ответ дан 15 December 2019 в 06:38
поделиться

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

0
ответ дан 15 December 2019 в 06:38
поделиться

Как предложил @Banengusk - этого можно достичь с помощью Mockito . Однако важно установить, что ваш DAO будет использовать Spring SqlMapClientTemplate , который обертывает ваш mock SqlMapClient . Фактически, 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
ответ дан 15 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: