나는 잠시 동안 자바에서 멀리 봤는데 JUnit을 5는 그동안 함께왔다. 나는 JUnit을 5 일부 기존의 JUnit 4 테스트를 다시 작성하기 위해 노력하고있어하지만 난 예외를 던질 방법을 처리하는 방법과 사투를 벌인거야. 예를 들어, 나는 (API에서 발견 이름으로 다른 클래스와 혼동되지 않음) 내가 전화 LocalizationUtils가 쓴 클래스를 가지고 있으며, 입력 및 반환 등 null이 아닌 기본 이름을하고자하는 () 메서드 호출의 GetResources있다 해당 리소스 번들 것이 발견 될 수있는 경우. 자원 번들을 찾을 수없는 경우 기본 이름이 null하고 사용해 MissingResourceException 경우는 NullPointerException이 발생합니다. 여기 코드는 :
static public ResourceBundle getResources(String baseName) throws NullPointerException, MissingResourceException {
if (baseName == null) {
final String msg = "The base name cannot be null.";
NullPointerException npExcp = new NullPointerException(msg);
Logger logger = Logger.getLogger(CLASS_NAME);
logger.log(Level.SEVERE, msg, npExcp);
throw npExcp;
}
/* Get the resource bundle for the current locale. */
try {
return(ResourceBundle.getBundle(baseName));
}
catch (MissingResourceException mrExcp) {
String msg = "Unable to find resources for base name " + baseName + ".";
Logger logger = Logger.getLogger(CLASS_NAME);
logger.log(Level.SEVERE, msg, mrExcp);
throw mrExcp;
}
}
JUnit을 5 수동 예외 처리의 예를 제공한다 :
@Test
void exceptionTesting() {
Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
throw new IllegalArgumentException("a message");
});
assertEquals("a message", exception.getMessage());
}
이 예는 나에게 아무 의미가 없습니다. 이 메시지 허공의 "메시지"밖으로 예외를 만들 것으로 보인다. 나는 그것이 실제로 전혀 클래스 나 메소드를 실행되는 것을 볼 수 없습니다. 이것은 내 인생에서 어쩌면 / 아마 그냥 오해를 작동하도록되어 방법의 실제 설명이 없습니다.
실제로 발생하는 내 코드와 힘을 모두 오류를 실행하는 테스트를 작성하기 위해, 나는이 JUnit을 5 테스트를 썼다 :
@Test
void testGetResourcesString() {
//Normal cases
//Exception - input parameter is null
/* Verify that the expected type of exception was thrown. */
Throwable npExcp = assertThrows(NullPointerException.class, () -> {
LocalizationUtils.getResources(null);
});
/* Verify that the exact right error message was generated. */
assertEquals("The base name cannot be null.", npExcp.getMessage());
//Exception - all input is non-null but resource bundle not found
/* Verify that the expected type of exception was thrown. */
Throwable mrExcp = assertThrows(MissingResourceException.class, () -> {
LocalizationUtils.getResources("foo");
});
/* Verify that the exact right error message was generated. */
assertEquals("Can't find bundle for base name foo, locale en_CA", mrExcp.getMessage());
}
내가 기대하고 실제로 클래스와 메소드가 예외를 슬로우하는 실행 이후이 설명서의 예보다 더 논리적 보인다이 테스트에서 모두 작동합니다. 나는 또한이 곳 대신 하나의 여러 입력 매개 변수를 사용하는 방법을 쉽게 상상할 수 있기 때문에 딱 맞는 메시지가 생성 된 것을 확인하고 싶어 어떤 널되는 매개 변수의 고유 메시지와 함께 예외가 발생합니다. 간단히 발생 된 권리 예외가 나에게 충분히처럼 보이지 않는 것을 결정 : 나는 올바른 메시지가 그래서 코드가 여러에서 우측 널 매개 변수에 반응한다 알고 만들어 졌음을 확인하려는 생각합니다.
나는 수동 비록 잘못 생각하기를 꺼려 해요; 나는 몇몇 경험있는 개발자의 팀이 쓴 매우 신중했다 상상한다. 나보다 더 JUnit을 5 지식을 캔 사람 - 다만 지금까지의 JUnit 5 사용하는 모든 사람에 대한 있어야합니다 - 일에이 가정하는 방법이있는 경우 설명서의 예는, 정확하고 있음을 확인, 때 더 클래스 나 메소드 이름없는 제공되는?
이 예제에서는 "방법"을 호출한다. 람다 식 () -> {...}
정의 익명 방법 . 그것은 하나의 문이 포함되어 있습니다 throw new IllegalArgumentException
.
() -> {} // No parameters; result is void
() -> 42 // No parameters, expression body
() -> null // No parameters, expression body
() -> { return 42; } // No parameters, block body with return
() -> { System.gc(); } // No parameters, void block body
(int x) -> x+1 // Single declared-type parameter
(int x) -> { return x+1; } // Single declared-type parameter
(x) -> x+1 // Single inferred-type parameter
x -> x+1 // Parens optional for single inferred-type case
그래서 예를 들어 하나 개의 방법이 있고, 그것을 수행하는 모든 예외가 발생합니다.
() -> { throw new IllegalArgumentException("a message"); }
그리고에 당신의 코드 실제로, 매개 변수없이 하나의 방법을 정의하고 하나 개의 매개 변수와 메소드를 호출.
() -> { LocalizationUtils.getResources(null); }