При экспериментировании с 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!");
}
}
}