在进行一些数据源测试时,我编写了这个小型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
,测试仍然不会变绿。
任何人都可以帮我确定一些正常的异常组合,我希望我的测试用例能够运行绿色条吗? (甚至可能检索异常消息?)
答案 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
是不够的,而不关心原因是什么?