Java 如何在EJB中测试异常

Java 如何在EJB中测试异常,java,unit-testing,jakarta-ee,junit,ejb,Java,Unit Testing,Jakarta Ee,Junit,Ejb,我正在我的应用程序中进行一些junit测试,并测试EJB中的验证方法。 我对数据何时通过进行了测试,对方法何时引发异常进行了测试 这是我的孩子们: @Test(expected = ValidationException.class) public void testValidationError() { service.validateCsvFile(createCsvContents(false)); } @Test public void testValidati

我正在我的应用程序中进行一些junit测试,并测试EJB中的验证方法。 我对数据何时通过进行了测试,对方法何时引发异常进行了测试

这是我的孩子们:

@Test(expected = ValidationException.class)
public void testValidationError() {
    service.validateCsvFile(createCsvContents(false));
}

@Test        
public void testValidationOk() {
    service.validateCsvFile(createCsvContents(true));
}
这是我的方法:

@Override
public void validateCsvFile(List<CSVDataRow> csvContents) throws MyException {
    List<String> repeatedTransactionIds = new ArrayList<String>();
    Set<String> allTransactionIds = new HashSet<String>();
    for (CSVDataRow cSVDataRow : csvContents) {
        //performing a database size validation
        Validation<CSVDataRow> validation = Validator.validate(cSVDataRow);
        if (validation.hasViolations()){
            throw new ValidationException("Errors found for transactionId: " + cSVDataRow.getTransactionId(), validation.getErrorMessagesWithPropertyPath());
        }
        if (!allTransactionIds.add(cSVDataRow.getTransactionId())){
            repeatedTransactionIds.add(cSVDataRow.getTransactionId());
        }
    }

    if (!repeatedTransactionIds.isEmpty()){
        throw new ValidationException("Duplicated transactionIds found", repeatedTransactionIds.toString());
    }

}
@覆盖
public void validateCsvFile(列出CSV内容)引发MyException{
List RepeatedTransactionId=new ArrayList();
Set-AllTransactionId=new HashSet();
用于(CSVDataRow CSVDataRow:csvContents){
//执行数据库大小验证
Validation=Validator.validate(cSVDataRow);
if(validation.hasViolations()){
抛出新的ValidationException(“transactionId发现错误:+cSVDataRow.getTransactionId(),validation.getErrorMessagesWithPropertyPath());
}
如果(!AllTransactionId.add(cSVDataRow.getTransactionId())){
repeatedTransactionId.add(cSVDataRow.getTransactionId());
}
}
如果(!RepeatedTransactionId.isEmpty()){
抛出新的ValidationException(“找到重复的TransactionId”,RepeatedTransactionId.toString());
}
}
testValidationError junit未通过。 这给我带来了一个错误:

java.lang.Exception: Unexpected exception, expected<xxxxx.backend.exception.ValidationException> but was<javax.ejb.EJBException>
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
java.lang.Exception:意外异常,应为,但为
位于org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
位于org.junit.internal.runners.statements.runafter.evaluate(runafter.java:31)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)

默认情况下,当在EJB方法中引发异常时,EJB容器将使用。但是,您可以使用注释您的EJB方法,这将告诉EJB容器直接抛出应用程序异常。

不幸的是,您正在EJB中运行,默认情况下,EJB总是使用EJBException包装。但是,您可以告诉容器抛出应用程序异常,我将提供一个答案。谢谢。这解决了我的问题。非常感谢你!注:只有一个问题:@ApplicationException(rollback=true)和@ApplicationException(rollback=false)之间有什么区别?Np=)回滚与EJB的上下文有关,如果它是否在事务上下文中。例如,如果您使用JMS或JPA执行某些操作,并且您确实或不希望此业务方法的异常导致事务回滚。