Hibernate域对象'not null'字段 - 如果对象中的字段为null,则模拟测试应该抛出错误

时间:2015-12-02 20:00:46

标签: java spring hibernate junit powermockito

有一个Hibernate域对象,其'not null'字段有注释@Column(nullable=false),DAO类方法将此对象保存在DB中。

我正在使用PowerMockito模拟创建DAO调用,模拟调用工作正常,但如果我为该字段传递null,则模拟测试不会抛出该字段为空的错误。

下面是代码,工具/技术(java,spring,hibernate,sqlserver,junits,powermockit)。省略了与spring上下文和hibernate会话配置相关的代码更改。

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.          
    }
}

1 个答案:

答案 0 :(得分:1)

实际上你的DAO中没有进行验证(非空性检查)。你确实声明你的字段为非空,但是你的 getSession().save(entity); 方法调用了:

HibernateSession

就是这样。现在,验证将通过{{1}}进行保存,但所有被归类的人都会被嘲笑。所以他们不会进行任何验证。

一般来说,这是一个很好的规则,每次你不小心嘲笑你测试过的东西时,你都会退后一步并重新评估:

  

我写了那段代码吗?我为什么要测试它?

在这种情况下,可能答案是,您应该相信Hibernate会处理事情。如果你想测试你的模型定义,你需要设置一个完整的Hibernate上下文,并在Hibernate没有被模拟的情况下执行真正的测试。