4.1 @Uitgeschakeld
Laten we nu eens kijken naar enkele zeer nuttige en populaire annotaties van het JUnit-framework. Met de eerste annotatie kunt u een specifieke test uitschakelen zodat JUnit deze niet aanroept. Het is nodig in gevallen waarin u merkt dat de test niet correct werkt, of u de code wijzigt en de test per ongeluk breekt.
Zoals ik al eerder schreef wordt 99% van de testen door niemand ondersteund, dus vroeg of laat blijken ze allemaal uitgeschakeld te zijn. Daarom is deze annotatie de eerste in de lijst met nuttige.
Overweeg haar voorbeeld:
public class AppTest {
@Disabled("Test is temporarily disabled. True, true")
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
In het bovenstaande voorbeeld testOnDev()
wordt de methode niet aangeroepen. Trouwens, de annotatie @Disabled
kan direct vóór de klassendeclaratie worden geschreven, dan worden alle methoden ervan genegeerd.
@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
4.2 @Genest
Met JUnit kunt u testmethoden aanroepen voor geneste klassen. Ik bedoel geneste testklassen. Het is geen feit dat je ze vaak zult tegenkomen, maar er is zo'n mogelijkheid, dus je moet begrijpen wat het is.
Om de methoden van een geneste klasse aan te roepen voordat deze wordt gedeclareerd, moet u een annotatie schrijven @Nested
. Voorbeeld:
public class AppTest {
@Nested
public class DevStagingEnvironment {
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
@Nested
public class ProductionEnvironment {
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
}
Meer details zijn te vinden in de officiële documentatie .
4.3 @ExtendWith
Een andere handige annotatie is @ExtendWith
. Hoogstwaarschijnlijk zul je haar heel vaak ontmoeten, dus laten we haar in meer detail bekijken.
JUnit is een krachtig framework waarmee je verschillende plug-ins (extensies) kunt schrijven voor flexibele aanpassing van je werk. Sommige extensies kunnen statistieken over tests verzamelen, andere kunnen een in-memory bestandssysteem emuleren, andere kunnen het werken binnen een webserver emuleren, enzovoort.
Als uw code binnen een raamwerk draait (bijvoorbeeld Spring), beheert dit raamwerk bijna altijd het maken en configureren van objecten in uw code . Daarom is een speciale testplug-in onmisbaar. Voorbeelden:
Voorbeeld 1. De extensie WebServerExtension
gaat over naar de aangeroepen testmethode URL
om correct te werken.
@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
WebClient webClient = new WebClient();
// Use WebClient to connect to web server using serverUrl and verify response
assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}
Dit is hoe tests meestal beginnen met het testen van code die werkt met het Spring-framework:
@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {
@MockBean
TestService service;
@Test
void test() {
assertNotNull(service); // Test succeeds
}
}
SpringExtension
maakt een testversie van het Spring-framework, maar MockitoExtention
stelt u in staat om nep-objecten te maken. Nepvoorwerpen is een heel interessant onderwerp, we zullen het zeker bespreken, maar iets later.
4.4 @Time-out
Laten we deze lezing afsluiten met een kleine en interessante aantekening @Timeout
. Hiermee kunt u de tijd instellen om de test uit te voeren. Als de test meer tijd kostte dan gespecificeerd in de annotatie, wordt deze als mislukt beschouwd.
class TimeoutDemo {
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void failsIfExecutionTimeExceeds100Milliseconds() {
// test will fail if it takes more than 100 milliseconds
}
}
Hiermee sluiten we onze lezing af.
GO TO FULL VERSION