Java >> Java tutorial >  >> Tag >> extends

JUnit forvirring:brug 'extends TestCase' eller '@Test'?

Forskellen er ret let:

  • forlænger TestCase er måden, enhedstest blev skrevet i JUnit 3 (selvfølgelig understøttes det stadig i JUnit 4)
  • ved at bruge @Test annotering er den måde, der introduceres af JUnit 4

Generelt bør du vælge annotationsstien, medmindre kompatibilitet med JUnit 3 (og/eller en tidligere Java-version end Java 5) er nødvendig. Den nye måde har flere fordele:

  • @Test annotering er mere eksplicit og er lettere at understøtte i værktøjer (det er f.eks. nemt at søge efter alle test på denne måde)
  • Flere metoder kan annoteres med @Before /@BeforeClass og @After /@AfterClass giver mere fleksibilitet
  • Understøttelse af @Rule annoteringer om ting som ExpectedException
  • Understøttelse af @Ignored anmærkning
  • Støtte til alternative testløbere, der bruger @RunWith

For at teste for forventede undtagelser i en JUnit 3 TestCase du bliver nødt til at gøre teksten eksplicit.

public void testMyException() {
  try {
    objectUnderTest.myMethod(EVIL_ARGUMENT);
    fail("myMethod did not throw an Exception!");
  } catch (MyException e) {
    // ok!
    // check for properties of exception here, if desired
  }
}

JUnit 5 introducerede endnu en API-ændring, men bruger stadig annoteringer. Den nye @Test annotation er org.junit.jupiter.api.Test (den "gamle" JUnit 4 var org.junit.Test ), men det virker stort set det samme som JUnit 4.


Jeg har en præference for JUnit 4 (annotationstilgang), fordi jeg finder den mere fleksibel.

Hvis du vil bygge testsuite i JUnit 4, skal du oprette en klasse, der grupperer alle test som denne:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;


@RunWith(Suite.class)
@SuiteClasses({
    Test1.class,
    Test2.class,
    Test3.class,
    Test4.class
})public class TestSuite
{
 /* empty class */
}

Der er en ubesvaret del af dit spørgsmål, og det er "Hvad er den rigtige måde at gruppere test for tilgang B?"

Det officielle svar er, at du annoterer en klasse med en @RunWith(Suite.class) og derefter bruger @Suite.SuiteClasses-annotationen til at liste klasserne. Sådan gør JUnit-udviklerne det (manuel liste over hver klasse i en suite). På mange måder er denne tilgang en forbedring, idet det er trivielt og intuitivt at tilføje før suite og efter suite adfærd (tilføj bare en @BeforeClass og @AfterClass metode til klassen, der er kommenteret med @RunWith - meget bedre end den gamle TestFixture ).

Det har dog et tilbageskridt, idet annoteringer ikke tillader dig dynamisk at oprette listen over klasser, og det bliver en smule grimt at arbejde omkring det problem. Du skal underklasser Suite-klassen og dynamisk oprette rækken af ​​klasser i underklassen og videregive den til Suite-konstruktøren, men dette er en ufuldstændig løsning, da andre underklasser af Suite (såsom Kategorier) ikke fungerer med den og i det væsentlige understøtter ikke dynamisk testklasseindsamling.


Java tag