有一个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.
}
}
答案 0 :(得分:1)
实际上你的DAO中没有进行验证(非空性检查)。你确实声明你的字段为非空,但是你的 getSession().save(entity);
方法调用了:
HibernateSession
就是这样。现在,验证将通过{{1}}进行保存,但所有被归类的人都会被嘲笑。所以他们不会进行任何验证。
一般来说,这是一个很好的规则,每次你不小心嘲笑你测试过的东西时,你都会退后一步并重新评估:
我写了那段代码吗?我为什么要测试它?
在这种情况下,可能答案是,您应该相信Hibernate会处理事情。如果你想测试你的模型定义,你需要设置一个完整的Hibernate上下文,并在Hibernate没有被模拟的情况下执行真正的测试。