Не удается проверить класс, возвращающий пользовательское исключение

При экспериментировании с JUnit я пытаюсь проверить простой частный метод следующим образом, этот метод получает строку String и не включает в нее слово 'Dummy'.

Я знаю, что можно поставить тест в том же пакете, что и модификатор доступа к классу и модификатору доступа для пакета, но я хотел бы использовать рефлексию, чтобы узнать это.

private void validateString(String myString) throws CustomException {

    if (myString.toLowerCase().matches(".*dummy.*"))
        throw new CustomException("String has the invalid word!");

}

Я пытаюсь получить доступ к частному методу посредством отражения, но тест не удался! Это показывает следующее исключение:

java.lang.AssertionError:Expected test to throw
(an instance of com.myproject.exception.CustomException and exception 
with message a string containing "String has the invalid word!")

Основываясь на ответе этого question, я также ловлю InvocationTargetException.

JUnit

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

    @Test
    public void shouldThrowExceptionForInvalidString() {

        thrown.expect(CustomException.class);
        thrown.expectMessage("String has the invalid word!");

        try {
            MyClass myCls = new MyClass();
            Method valStr = myCls.getClass().getDeclaredMethod(
                    "validateString", String.class);
            valStr.setAccessible(true);
            valStr.invoke(myCls, "This is theDummyWord find it if you can.");
        } catch (InvocationTargetException | NoSuchMethodException
                | SecurityException | IllegalAccessException
                | IllegalArgumentException n) {
            if (n.getCause().getClass() == CustomException.class) {
                throw new CustomException("String has the invalid word!");
            }
        }

    }

Ответ 1

Я согласен с @Stultuske в комментариях выше и переписываю тест на:

@Test
public void shouldThrowExceptionForInvalidString() {

    try {
        MyClass myCls = new MyClass();
        Method valStr = myCls.getClass().getDeclaredMethod(
                "validateString", String.class);
        valStr.setAccessible(true);
        valStr.invoke(myCls, "This is theDummyWord find it if you can.");
    } catch (Exception e) {
        assert(e instanceOf CustomException);
        assert(e.getMessage.equals("String has the invalid word!"));
    }

}

Или если вы хотите использовать ExpectedException

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

@Test
public void shouldThrowExceptionForInvalidString() {

    thrown.expect(CustomException.class);
    thrown.expectMessage("String has the invalid word!");

    MyClass myCls = new MyClass();
    Method valStr = myCls.getClass().getDeclaredMethod("validateString", String.class);
    valStr.setAccessible(true);
    valStr.invoke(myCls, "This is theDummyWord find it if you can.");

}