Как получить" реальное " исключение вместо 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.");
}
}
577   2  

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

    Ничего не найдено.