Как получить" реальное " исключение вместо EJBException в jUnit при использовании EJBContainer?
Я настраиваю модульный тест в своем приложении Java EE. Я использую JPA, JSF, Netbeans и Glassfish. Это также мое первое настоящее приложение java, так что простите меня, если ответ глупо очевиден!
Тест использует EJBContainer, обращается к сущности и пытается ввести нулевую запись. Затем он пытается ввести запись с слишком коротким именем пользователя. я хочу подтвердить, что правильные исключения выбрасываются.
Я могу добавить @Test(expected=javax.ejb.EJBException.class), но это будет ловить любое исключение. контейнер может бросить. Если это не ожидаемое исключение, я хочу знать об этом. (та же философия, что и ловить универсальное исключение, лучшая практика-ловить конкретное исключение)
Вот тест, который поможет проиллюстрировать:
//@Test(expected=javax.validation.ConstraintViolationException.class)
@Test(expected=javax.ejb.EJBException.class)
public void testCreate() throws Exception {
EJBContainer container = getContainer();//pull singleton container
AgentsFacade instance = (AgentsFacade) container.getContext().lookup("java:global/classes/AgentsFacade");
Agents badAgent = new Agents();
instance.create(badAgent);//null username
//Short username
Agents shortUsername = new Agents("srtnm");
instance.create(shortUsername);//must be > 6 in length
}
Вот аннотации для свойства "username" сущности агентов:
...
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(unique=true)
@Size(min=6, max=40)
@NotNull
private String username;
...
Как вы можете видеть, оба теста должны бросить либо javax.утверждение.ConstraintViolationException или какое-то другое исключение. Я могу видеть их в отладке информация в EJBException. Я не уверен, есть ли способ "извлечь" правильные исключения?
Наконец, я полный нуб. Так что, если я иду не по той дороге, дайте мне знать.
Спасибо.
-- Обновление --
В ответ на Стивена, вот результат, который я придумал.
try {
//Null username
Agents badAgent = new Agents();
instance.create(badAgent);
fail("NULL agent added!");//should never reach this point.
} catch (EJBException e) {
Exception causedByException = e.getCausedByException();
if(!(causedByException instanceof javax.validation.ConstraintViolationException)){
fail("ConstraintViolationException wasn't thrown.");
}
}
2 ответов:
Вам придется явно перехватить
EJBExceptionв модульном тесте, вызватьgetCause(), чтобы извлечь реальное исключение, а затем протестировать его по мере необходимости.(Таким образом вы проверяете, что правильные исключения выбрасываются в тесте JUnit версии 3.)
Для ожидаемого исключения можно использовать правила. Это примерно так:
@Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testCreate() { thrown.expect(<insert here conditions about the exception thrown>); //... }Я не уверен насчет этого, но я думаю, что это для JUnit 4.7
Comments