Как получить «реальное» исключение вместо EJBException в jUnit при использовании EJBContainer? - PullRequest
3 голосов
/ 23 декабря 2011

Я настраиваю модульный тест в своем приложении 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 объекта Agents:

...
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(unique=true)
@Size(min=6, max=40)
@NotNull
private String username;
...

Как видите, оба теста должны генерировать либо javax.validation.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 ]

5 голосов
/ 23 декабря 2011

Вам придется явно перехватить EJBException в модульном тесте, вызвать getCause(), чтобы извлечь реальное исключение, а затем протестировать его при необходимости.

(Это способ проверки правильностиисключения генерируются в тесте JUnit версии 3.)

2 голосов
/ 23 декабря 2011

Вы можете использовать правила для ожидаемого исключения. Это примерно так:

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

@Test
public void testCreate()  {
     thrown.expect(<insert here conditions about the exception thrown>);
     //...
}

Я не уверен в этом, но думаю, что это для JUnit 4.7

...