2012-09-19 7 views
10

Sono un principiante all'esame di unità. Sto usando TestNG con MyEclipse per sviluppare casi di test unitari per la mia applicazione. Mentre lo faccio, sto affrontando alcuni problemi con EasyMock. Ecco il mio codice (il nome della classe, i nomi dei metodi e i tipi di ritorno sono cambiati per ragioni di sicurezza, ma avrete una chiara idea di cosa sto cercando di ottenere qui).Test delle eccezioni di un metodo con EasyMock

public MyClass 
    { 
     // This is a method in my class which calls a collaborator which I 
     // want to mock in my test case 
     public SomeObject findSomething(SomeOtherObject param) throws Exception 
     { 
      SomeOtherObject param a = myCollaborator.doSomething(param); 
      // Do something with the object and then return it 
      return a; 
     } 
    } 

Ora ecco la mia prova. Ora quello che voglio veramente ottenere nel mio caso di prova è che voglio verificare che la mia funzione (findSomething) correttamente generi un'eccezione nel caso in cui venga lanciata qualche eccezione. In futuro alcuni sviluppatori dello possono modificare la firma (l'eccezione non è parte del metodo signature) del metodo e rimuovere i thea Eccezione dal mio metodo. Quindi, come posso assicurarmi che nessuno cambi lo ?

@Test(dataProvider="mydataProvider", expectedExceptions=Exception.class) 
public void MyTest(SomeOtherObject param) throws Exception { 
{ 
    EasyMock.expect(myCollaboratorMock.doSomething(param)).andThrow(new Exception()); 
    EasyMock.replay(myCollaboratorMock); 
} 

io sono sempre un'eccezione

"java.lang.IllegalArgumentException: ultima metodo chiamato sui campioni non può gettare java.lang.Exception"

Quello che sto facendo male Qui? Qualcuno può far luce su come scrivere un test per il mio particolare scenario?

risposta

18

Il metodo doSomething() del collaboratore non dichiara che può generare Eccezione e stai dicendo alla sua finta di lanciarne una. Non è possibile.

L'eccezione è un'eccezione controllata. Può essere lanciato solo se è dichiarato nella firma del metodo. Se il metodo non ha la clausola throws, tutto ciò che può fare è generare eccezioni di runtime (ad esempio RuntimeException o qualsiasi classe di discendenti).

+0

Falso. Usando [bugie generiche] (http://java.dzone.com/articles/throwing-undeclared-checked) è possibile lanciare eccezioni controllate da praticamente ovunque. – jontejj