2017-05-01 3 views
2

Ich habe eine Methodeein Verfahren Mocking die Ausnahme auslöst

Service.class

Public void foo() throws SchedulerException{ 

      .......... 

} 

Test.class

Public void testExample(){ 
    Mockito.doThrow(SchedulerException.class).when(f.foo()); 
} 

Compiler fragt mich entweder einen try/catch zu setzen oder wirft for testExample() Gibt es eine andere Möglichkeit, das gleiche zu erreichen?

+0

Ich nehme an, dass 'SchedulerException'' 'RuntimeException' nicht verlängert? In diesem Fall muss Ihre Testmethode "throw SchedulerExcpetion" deklarieren. Es gibt keinen anderen Weg, um das zu erreichen, was Sie wollen, da Java das Catch-or-Throws-Prinzip erzwingt. die einzige Ausnahme (Wortspiel) dazu sind 'RuntimeException's (weil niemand wirklich jeden Array-Zugriff in einen try-catch-Block einschließen möchte ...) – Turing85

+1

Und nur für Annotationszwecke, fügen Sie möglicherweise auch' @Test hinzu (expected = SchedulerException.class) 'falls das oben der Fall ist. – Ishnark

+0

Wenn der Code innerhalb des Tests eine Ausnahme auslöst, bedeutet dies, dass der Test fehlschlägt. Daher ist es besser, 'throws SchedulerException' auf' testExample' zu ​​setzen (Sie müssen es nicht setzen, wenn Ihre Ausnahme 'RuntimeException' erweitert): der Test wird fehlschlagen, wenn die Ausnahme ausgelöst wird. Wenn der Zweck des Tests darin besteht, zu testen, dass die Ausnahme ausgelöst wird, würden Sie try-catch verwenden, aber ich denke, das ist nicht Ihr Fall. –

Antwort

1

Ihre Frage nicht angegeben, ob SchedulerException extends RuntimeException, aber von Ihrer Frage nehme ich an, es nicht.

Ihre Testmethode (testExample()) muss throws SchedulerException sein, wenn SchedulerException nicht extends RuntimeException. Dies liegt an Javas Natur, das Catch-or-Throw-Prinzip durchzusetzen. Die Details finden Sie in JLS §11.

Wie von @Ishnark vorgeschlagen, wenn Sie erwarten, dass Ihr Test irgendeine Art von Exception, you should annotate the test with @Test(expected=ExcpectedExceptin.class) wirft (auch wenn Ihre Ausnahme extends RuntimeExcpetion).

+0

Nur um die Antwort oben zu "re-phrasieren". Wenn eine Methode etwas aufruft, das eine Ausnahme auslösen kann. Sie MÜSSEN einen der folgenden Schritte ausführen (außer, wenn die Ausnahme RuntimeException verlängert): Entweder Sie fügen ihn der Methodensignatur hinzu (die der Klasse übergeben wird, von der er aufgerufen wurde), oder Sie versuchen/fangen und behandeln die Ausnahme hier . Im Falle eines Tests. Junit wird jeden Test nicht bestehen, wenn eine Ausnahme ausgelöst wird. Wie Turing85 sagte, wenn es der Fall ist, akzeptiert die Junit-Annotation @Test ein Argument, das erwartet wird = TheExceptionThatShouldBeThrown.class Der Test wird nur passieren, wenn eine Ausnahme ausgelöst wird – drgn

Verwandte Themen