2009-03-23 13 views
92

Sono passato a JUnit4.4 da JUnit3.8. Eseguo i miei test usando formica, tutti i miei test vengono eseguiti correttamente ma le classi di utilità di test falliscono con l'errore "Nessun metodo eseguibile". Lo schema che sto usando è quello di includere tutte le classi con nome * Test * nella cartella test.JUnit: come evitare "nessun metodo eseguibile" nelle classi di utilità di test

Comprendo che il runner non è in grado di trovare alcun metodo annotato con l'attributo @Test. Ma non contengono tali annotazioni perché queste classi non sono test. Sorprendentemente quando si eseguono questi test in eclissi, non si lamenta di queste classi.

In JUnit3.8 non era un problema dato che queste classi di utilità non estendevano TestCase in modo che il corridore non tentasse di eseguirli.

So che posso escludere queste classi specifiche nel target junit nello script ant. Ma non voglio modificare il file di build su ogni nuova classe di utilità che aggiungo. Posso anche rinominare le classi (ma dare un buon nome alle classi è sempre stato il mio talento più debole :-))

Esiste una soluzione elegante per questo problema?

+0

I tuoi test funzionano su Eclipse/NetBeans/il tuo IDE preferito? – guerda

+0

Io uso eclissi. In realtà non ci sono problemi lì, in qualche modo Eclipse non tenta di eseguire queste classi. Mi domando come? – LiorH

+0

Non so se abbiamo capito la tua domanda. Per favore rileggi la tua domanda e probabilmente aggiungi qualche altra informazione. – guerda

risposta

41

Supponendo di avere il controllo del modello utilizzato per trovare le classi di test, suggerirei di modificarlo in modo che corrisponda a *Test anziché a *Test*. In questo modo, TestHelper non verrà abbinato, ma lo sarà FooTest.

+1

Non credo che sarebbe di aiuto, perché si è trasferito a JUnit 4.4 e questo non dovrebbe avere importanza. – guerda

+2

Sembra che tu abbia perso il punto della mia risposta. Ha un filtro nome per determinare le classi da considerare come test. Se cambia il filtro, può facilmente escludere le classi di aiuto. –

+1

Il tuo suggerimento è valido, tuttavia ho controllato le mie classi di test e alcune iniziano con Test e alcune terminano con Test. nessuna chiara distinzione tra classi di utilità e classi di test reali. Pensi che la convenzione che hai suggerito sia una buona pratica? (ad esempio, i programmi di utilità iniziano con Test e i test terminano con Test) – LiorH

4

Che ne pensi di aggiungere un metodo di prova vuoto a queste classi?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() { 
    assertTrue(true); // do nothing; 
} 
+0

interessante, grazie – LiorH

+6

ma che aumenta falsamente il numero dei test che abbiamo :) non è un grosso problema – Sudarshan

128

Annota le tue classi util con @Ignore. Ciò farà sì che JUnit non provi a eseguirli come test.

+9

Grazie. Questa dovrebbe essere la risposta accettata! –

+6

In realtà no, non dovrebbe. @ Ignora è per disabilitare temporaneamente i test. –

+1

Scusa ma è una cattiva idea. Vuoi iniziare ad annotare il tuo codice di produzione con le annotazioni relative ai test solo perché potrebbero corrispondere a un modello di prova? La risposta corretta è quella di correggere i nomi delle classi se attivano la corrispondenza del modello per i test. E assicurati che il modello trovi solo le classi che FINE con Test. Questo è un modello comunemente accettato –

70

Il mio caso specifico presenta il seguente scenario. I nostri test

public class VenueResourceContainerTest extends BaseTixContainerTest 

tutto estendono

BaseTixContainerTest 

e JUnit stava cercando di eseguire BaseTixContainerTest. Poor BaseTixContainerTest stava solo cercando di configurare il contenitore, impostare il client, ordinare un po 'di pizza e rilassarsi ... amico.

Come accennato in precedenza, è possibile annotare la classe con

@Ignore 

Ma quello causato JUnit a riferire che prova come saltato (al contrario di completamente ignorato).

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1 

Questo mi ha irritato.

Così ho reso BaseTixContainerTest astratto, e ora JUnit lo ignora davvero.

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 
+5

Molto meglio di '@ Ignore' – neworld

+0

questo ha risolto anche il mio problema, grazie! – Rumal

+0

Ho provato l'approccio @Ignore e ho pensato, beh, va bene, poi ho letto questa risposta e mi sono schiaffeggiato in fronte, "Of * course *!" – dnuttle

31

Per evitare JUnit da istanziare la vostra classe di base di test appena rendono

public abstract class MyTestBaseClass { ... whatever... } 

(@Ignore segnala come ignorato, che mi riservo per temporaneamente test ignorati.

+2

I corridori di JUnit spesso tentano di istanziare anche classi astratte e quindi falliscono con un errore di istanziazione. –

+0

Funziona perfettamente per le mie classi di test di base – ruX

+2

Questo funziona a causa del nome (non termina in Test), non a causa del modificatore astratto. Cambia il nome della classe in MyBaseClassTest e proverà a istanziare come menzionato da @ HollyCummins (e fallisce) – Hutch

0

Mi trovavo anche di fronte a un problema simile ("nessun metodo eseguibile ..") sull'esecuzione del codice più semplice (utilizzando @Test, @Before ecc.) E ho trovato la soluzione da nessuna parte. Stavo usando Junit4 ed Eclipse SDK versione 4.1.2. Risolto il problema utilizzando l'ultimo Eclipse SDK 4.2.2. Spero che questo aiuti le persone che stanno lottando con un problema in qualche modo simile.

5

Ant ora viene fornito con l'attributo skipNonTests che è stato progettato per fare esattamente quello che sembra essere alla ricerca. Non c'è bisogno di cambiare le classi base per astrarre o aggiungere annotazioni a loro.

+1

Sembra che l'attributo 'skipNonTests' sia disponibile solo in ant 1.9+, il che è un peccato, dal momento che sembra incredibilmente utile. Escluderà anche le superclassi di test astratte. –

4

Fare attenzione quando si utilizza il completamento del codice IDE per aggiungere l'importazione per @Test.

Deve essere import org.junit.Test e non import org.testng.annotations.Test, ad esempio. Se lo fai, otterrai l'errore "nessun metodo eseguibile".

+0

Questo dovrebbe essere un commento piuttosto che una risposta. –

+1

Non vedo perché. È una soluzione valida –

+1

Intellij Idea 2017 mi ha fatto impazzire importando 'org.junit.jupiter.api.Test'! ma grazie a te è risolto ora – AmiNadimi

10
  1. Se questa è la classe di test di base per esempio AbstractTest e tutti i test estende questo quindi definire questa classe come astratta
  2. Se è classe Util allora meglio togliere * Test dalla classe rinominarlo è MyTestUtil o Utils ecc.
Problemi correlati