2014-03-31 4 views
6

Ich teste Java-Code mit Spock. Ich teste diesen Code:Spock-Throw-Ausnahmetest

try { 
    Set<String> availableActions = getSthAction() 
    List<String> goodActions = getGoodAction() 
    if (!CollectionUtils.containsAny(availableActions ,goodActions)){ 
     throw new CustomException(); 
    } 
} catch (AnotherCustomExceptio e) { 
    throw new CustomException(e.getMessage()); 
} 

I Test schrieb:

def "some test"() { 
    given: 
    bean.methodName(_) >> {throw new AnotherCustomExceptio ("Sth wrong")} 
    def order = new Order(); 
    when: 
    validator.validate(order) 
    then: 
    final CustomException exception = thrown() 
} 

Und es schlägt fehl, weil AnotherCustomExceptio geworfen wird. Aber in der try{}catch Block Ich fange diese Ausnahme und werfen eine CustomException, so dass ich erwartet, dass meine Methode CustomException und nicht AnotherCustomExceptio werfen wird. Wie kann ich es testen?

+0

Können Sie den Kontext des Java-Code erweitern, zeigt 'bean' und' validator', 'Order'? – dmahapatro

+0

Es ist nicht klar, wie der Produktionscode und der Testcode zusammenpassen. (Zum Beispiel gibt es keinen Aufruf von "bean # methodName" im Produktionscode.) Höchstwahrscheinlich wird die Ausnahme nicht von dem oben gezeigten try-Block ausgelöst. Sie sollten dies im Debugger überprüfen können. –

+0

Haben Sie das gelöst? –

Antwort

9

Ich glaube, Ihr then Block muss behoben werden. Versuchen Sie, die folgende Syntax:

then: 
thrown CustomException 
0
def "Exception Testing 1"(){ 
    given : 
    def fooObject = mock(Foo); 
    when: 
    doThrow(RuntimeException).when(fooObject).foo() 
    then: 
    thrown RuntimeException 
} 

def "Exception Testing 2"(){ 
    given : 
    def fooObject = Mock(Foo); 
    when: 
    when(fooObject.foo()).thenThrow(RuntimeException) 
    then: 
    thrown RuntimeException 
}