Запросы критериев EasyMock и Hibernate

Я пытаюсь протестировать метод dao, который использует API критериев гибернации, используя JUnit4 и EasyMock 2.4.

Когда я запускаю тестовое приспособление testGetAsset, я получаю следующее исключение:

java.lang.AssertionError:   
Unexpected method call add(name=Test):
   add(name=Test): expected: 1, actual: 0
   add(source=GSFP): expected: 1, actual: 0  
   uniqueResult(): expected: 1, actual: 0  
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:32)  
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:61)  
at $Proxy7.add(Unknown Source)  
at com.hsbc.sfd.funddb.persistence.dao.AssetDaoImpl.getAsset(AssetDaoImpl.java:80)  
at com.hsbc.sfd.funddb.persistence.AssetDaoTest.testGetAsset(AssetDaoTest.java:62)  

Я думаю, что проблема связана с тем, что объект фиктивных критериев не инициализируется с помощью Asset.class, но я новичок в EasyMock и фиктивных объектах в целом, поэтому я был бы очень признателен, если бы кто-нибудь мог посмотреть и сказать мне что мне нужно сделать, чтобы пройти тест.

Большое спасибо, Марк

Код ниже:

Метод Дао

public Asset getAsset(String name, Source source) {
    return (Asset) this.sessionFactory.getCurrentSession()
            .createCriteria(Asset.class)
            .add(Restrictions.eq("name", name))
            .add(Restrictions.eq("source", source))
            .uniqueResult();
}

Тестовый класс

public class AssetDaoTest {

private SessionFactory factory;
private Session session;
private Criteria criteria;

private AssetDaoImpl dao;


@Before
public void setUp() {
    factory = createMock(SessionFactory.class);
    session = createMock(Session.class);
    criteria = createMock(Criteria.class);

    dao = new AssetDaoImpl();
    dao.setSessionFactory(factory);
}

@Test
public void testGetAsset() {

    String name = "Test";
    Source source = Source.GSFP;

    Asset asset = new Asset();
    asset.setName(name);
    asset.setSource(source);

    expect(factory.getCurrentSession()).andReturn(session);
    expect(session.createCriteria(Asset.class)).andReturn(criteria);
    expect(criteria.add(Restrictions.eq("name", name))).andReturn(criteria);
    expect(criteria.add(Restrictions.eq("source", source))).andReturn(criteria);
    expect(criteria.uniqueResult()).andReturn(asset);

    replay(factory, session, criteria);

    dao.getAsset(name, source);
}
}

person MarkNS    schedule 20.01.2009    source источник


Ответы (1)


Проблема в том, что Ограничения, которые вы передаете в критерий.add в фиктивной настройке, не являются точно такими же экземплярами объекта, которые передаются на уровне DAO.

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

Возможно, стоит подумать о том, что вы на самом деле тестируете здесь. Хороший способ протестировать DAO с помощью спящего режима — смоделировать вашу базу данных, используя что-то вроде HSQL, вместо того, чтобы пытаться смоделировать API критериев гибернации. Затем вы можете загрузить некоторые образцы данных в свою базу данных в памяти и просто убедиться, что ваш DAO работает правильно.

person Clay    schedule 11.02.2009