Поле объекта домена гибернации «не пустое» - фиктивный тест должен выдавать ошибку, если поле внутри объекта равно нулю

Существует объект домена Hibernate с полем «не null», имеющим аннотацию @Column(nullable=false), метод класса DAO, который сохраняет этот объект в БД.

Я издеваюсь над вызовом create DAO, используя PowerMockito, фиктивный вызов работает нормально, но если я передаю значение null для поля, фиктивный тест не выдает ошибку, что поле равно null.

Ниже приведен код, инструменты/технологии (java, spring, hibernate, sqlserver, junits, powermockit). Пропущено несколько изменений кода, связанных с контекстом Spring и конфигурациями сеанса гибернации.

public class Entity{
    private String id;
    @Column(nullable=false)
    private String field;
    //setters and getters goes here
}

public class HibernateDAO{
    private SessionFactory sessionFactory;

    public void create(Entity entity){
        getSession().save(entity);
    }

    public void setSessionFactory(SessionFactory sf){
        sessionFactory = sf;
    }
}

public class HibernateDAOTest{
    HibernateDAO hibernateDAO = new HibernateDAO();
    public SessionFactory mockedSessionFactory; 
    public Session mockedSession; 
    public Query query;
    public SQLQuery sqlQuery;
    public Transaction mockedTransaction;
    @Before
    public void setup() {
        mockedSessionFactory =  PowerMockito.mock(SessionFactory.class);
        mockedSession = PowerMockito.mock(Session.class);
        mockedTransaction = PowerMockito.mock(Transaction.class);
        query = PowerMockito.mock(Query.class);
        sqlQuery = PowerMockito.mock(SQLQuery.class);

        PowerMockito.when(mockedSessionFactory.openSession()).thenReturn(mockedSession);
        PowerMockito.when(mockedSessionFactory.getCurrentSession()).thenReturn(mockedSession);
        PowerMockito.when(mockedSession.beginTransaction()).thenReturn(mockedTransaction);
    }

    @Test
    public void testCreate(){
        Entity entityToSave = new Entity();
        entityToSave.setId("123");
        entityToSave.setField(null);
        hibernateDAO.setSessionFactory(mockedSessionFactory);
        hibernateDAO.create(entityToSave);//this call should throw error that "field" is null but its not.          
    }
}

person Aamir    schedule 02.12.2015    source источник


Ответы (1)


На самом деле проверка (проверка на ненулевое значение) не выполняется в вашем DAO. Вы объявляете свое поле как ненулевое, но затем ваш метод create(Entity entity) вызывает:

    getSession().save(entity);

и это все, что он делает. Теперь проверка будет происходить при сохранении через HibernateSession, но все те, которые классифицированы, издеваются. Поэтому они не будут выполнять никакой проверки.

Как правило, это хорошее правило: каждый раз, когда вы случайно имитируете то же самое, что тестировали, вы делаете шаг назад и переоцениваете:

Я написал этот код? Почему я хочу это проверить?

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

person Gergely Bacso    schedule 02.12.2015