2016-11-25 11 views
4

Я пытаюсь проверить, что все мои исключения верны. Поскольку значения обернуты в CompletableFutures, исключение составляет ExecutionException, что является исключением, которое я обычно проверяю. Быстрый пример:ExpectedException причина причины?

void foo() throws A { 
    try { 
    bar(); 
    } catch B b { 
    throw new A(b); 
    } 
} 

Так foo() переводит исключение брошенной bar(), и все, что делается внутри CompletableFutures и AsyncHandlers (я не буду копировать весь код, это просто для справки)

В моем блоке Тесты Делаем bar() бросить исключение, и хотят, чтобы проверить, что он правильно переводится при вызове foo():

Throwable b = B("bleh"); 
when(mock.bar()).thenThrow(b); 
ExpectedException thrown = ExpectedException.none(); 
thrown.expect(ExecutionException.class); 
thrown.expectCause(Matchers.allOf(
       instanceOf(A.class), 
       having(on(A.class).getMessage(), 
         CoreMatchers.is("some message here")), 
     )); 

до сих пор так хорошо, б у Я также хочу, чтобы убедиться, что причина исключения A является исключением B и having(on(A.class).getCause(), CoreMatchers.is(b)) причин CodeGenerationException --> StackOverflowError

TL; DR: Как получить причину причины ожидаемого исключения?

+0

Может быть, этот вопрос является то, что вы хотите (я не уверен): https://stackoverflow.com/questions/ 871216/junit-possible-to-expect-a-wrapped-exception/20759785 # 20759785 –

+0

@RC. Почти, но я должен идти на один уровень глубже и получить следующую причину :) – Amir

+1

Вы должны уметь адаптировать: https://stackoverflow.com/a/6528640/180100 –

ответ

0

Может быть, вы должны попробовать с простым hasProperty Matcher, для того, чтобы локализовать проблему:

thrown.expectCause(allOf(
        instanceOf(A.class), 
        hasProperty("message", is("some message here")), 
     )); 
0

Это пример я использую для тестирования только причинная класса цепи. Ссылки:


import static org.hamcrest.Matchers.contains; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import org.hamcrest.Description; 
import org.hamcrest.Matcher; 
import org.hamcrest.TypeSafeMatcher; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ExpectedException; 

public class CausalClassChainTest { 

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

    @Test 
    public void test() throws Exception { 
     expectedException.expect(IOException.class); 
     expectedException.expectCause(new CausalClassChainMather(Exception.class, RuntimeException.class)); 

     throw new IOException(new Exception(new RuntimeException())); 
    } 

    private static class CausalClassChainMather extends TypeSafeMatcher<Throwable> { 

     private final Class<? extends Throwable>[] expectedClasses; 
     private List<Class<? extends Throwable>> causualClasses; 
     private Matcher<Iterable<? extends Class<? extends Throwable>>> matcher; 

     public CausalClassChainMather(Class<? extends Throwable>... classes) { 
      this.expectedClasses = classes; 
     } 

     @Override 
     public void describeTo(Description description) { 
      // copy of MatcherAssert.assertThat() 
      description.appendText("") 
        .appendText("\nExpected: ") 
        .appendDescriptionOf(matcher) 
        .appendText("\n  but: "); 
      matcher.describeMismatch(causualClasses, description); 
     } 

     @Override 
     protected boolean matchesSafely(Throwable item) { 

      List<Class<? extends Throwable>> causes = new ArrayList<Class<? extends Throwable>>(); 
      while (item != null) { 
       causes.add(item.getClass()); 
       item = item.getCause(); 
      } 
      causualClasses = Collections.unmodifiableList(causes); 

      // ordered test 
      matcher = contains(expectedClasses); 
      return matcher.matches(causualClasses); 
     } 
    } 

}