JUnit을 5 이해 예외 테스트

헨리 :

나는 잠시 동안 자바에서 멀리 봤는데 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 사용하는 모든 사람에 대한 있어야합니다 - 일에이 가정하는 방법이있는 경우 설명서의 예는, 정확하고 있음을 확인, 때 더 클래스 나 메소드 이름없는 제공되는?

Nfrs :

이 예제에서는 "방법"을 호출한다. 람다 식 () -> {...}정의 익명 방법 . 그것은 하나의 문이 포함되어 있습니다 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); } 

추천

출처http://43.154.161.224:23101/article/api/json?id=179310&siteId=1