在我的测试用例中,预期异常的正确组合是什么?

时间:2017-08-19 06:24:24

标签: java hibernate exception junit4

在进行一些数据源测试时,我编写了这个小型EJB。

@Stateless
@Remote(IEmpService.class)
@LocalBean
public class EmpService implements IEmpService {

  @PersistenceContext
  private EntityManager em;

  public void removeAllEmps() {
    em.createQuery("DELETE FROM Emp").executeUpdate();
  }

  public List<Emp> getAllEmps() {
    return em.createQuery("FROM Emp", Emp.class).getResultList();
  }
}

正如您所看到的那样,有一种方法可以删除条目,另一种方法可以选择它。对于我的测试,我创建了一个在桌面上具有select, insert, update但没有delete特权的用户。因此,执行方法getAllEmps将检索结果,而removeAllEmps因权利不足而失败。

我写了这个测试类

@RunWith(Arquillian.class)
public class DataSourceTest {

  @Deployment
  public static JavaArchive createDeployment() {
    // ...
  }

  @EJB
  EmpService testclass;

  @Rule
  public ExpectedException thrown = ExpectedException.none();

  @UsingDataSet("empBefore.xml")
  @Test
  public void testGetAllEmps() {
    List<Emp> allEmps = testclass.getAllEmps();

    Assert.assertEquals(2, allEmps.size());
  }

  @UsingDataSet("empBefore.xml")
  @Test
  public void testDeleteAllEmps() {
    thrown.expect(EJBException.class);
    thrown.expectCause(CoreMatchers.isA(SQLSyntaxErrorException.class));

    testclass.removeAllEmps();
  }

}     

虽然testGetAllEmps测试顺利进行,但我无法让testDeleteAllEmps生成绿色条,因为我没有得到&#34;外部&#的正确组合34; (thrown.excpect)例外和&#34;内部&#34; (thrown.expectCause)例外。执行测试方法时,我得到以下堆栈跟踪:

  

javax.ejb.EJBTransactionRolledbackException:org.hibernate.exception.SQLGrammarException:无法执行语句

     

[...]

     

引起:javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:无法执行语句

     

[...]

     

... 187更多

     

引起:org.hibernate.exception.SQLGrammarException:无法执行语句

     

[...]

     

... 217更多

     

引起:java.sql.SQLSyntaxErrorException:ORA-01031:权限不足

     

[...]

     

...... 226更多

所以我的期望是,&#34;外部&#34;例外是EJBTransaction(因为EJBTransactionRolledbackException是它的孩子)和&#34;内部&#34;一个是SQLSyntaxErrorException。 但即使我将thrown.expect更改为EJBTransactionRolledbackException和/或thrown.expectCause更改为SQLGrammarException,测试仍然不会变绿。

任何人都可以帮我确定一些正常的异常组合,我希望我的测试用例能够运行绿色条吗? (甚至可能检索异常消息?)

1 个答案:

答案 0 :(得分:0)

在我看来,第一个例外是SQLSyntaxErrorException,它引起了一个导致PersistenceException的SQLGrammarException,导致了EJBTransactionRolledBackException。所以你可以试试

thrown.expect(EJBException.class);
thrown.expectCause(CoreMatchers.isA(PersistenceException.class));

甚至

thrown.expect(EJBTransactionRolledBackException.class);
thrown.expectCause(CoreMatchers.isA(PersistenceException.class));

但为什么要这么麻烦?仅仅期待一个EJBException是不够的,而不关心原因是什么?