Maven a scope test

Maven má rozsahy (scope), kterými je možno ovlivnit, která závislosti se bude používat v které fázi maven buildu. Rozsah test znamená, že dané závislosti (knihovny) budou k dispozici během testovací fáze, ale jinak ne.
Jednoduchý příklad ukážu na knihovně TestNG, která se používá pro testování. Závislost v pom.xml vypadá následovně:

<dependency>
	<groupId>org.testng</groupId>
	<artifactId>testng</artifactId>
	<version>6.11</version>
	<scope>test</scope>
</dependency>

Pokud budeme mít třídu AppTest v balíčku src/test/java a v ní tento test, který používá knihovnu TestNG:

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals;

import org.testng.annotations.Test;

public class AppTest {
	@Test
	public void test() {
		assertNotEquals("A", "B");
		assertEquals(10, 10);
	}
}

při spuštění buildu aplikace pomocí mavenu (mvn test, z Eclipse IDE Run As -> Maven test) proběhne vše v pořádku (knihovna TestNG je k dipozici, kód se zkompiluje a proběhne).

Results :

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

Pokud bychom ale v naší netestové třídě v src/main/java z nějakého důvodu chtěli použít knihovnu TestNG.

import static org.testng.Assert.assertTrue;

public class App {
	public static void main(String[] args) {
		assertTrue(true);
        }
}

nepůjde nám kód spustit a dostaneme tuto chybu:

Exception in thread "main" java.lang.NoClassDefFoundError: org/testng/Assert
	at App.main(App.java:10)
Caused by: java.lang.ClassNotFoundException: org.testng.Assert
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 1 more

Knihovna TestNG není k dispozici (bude pouze ve fázi testů spouštěných mavenem) a kód nejde zkompilovat. Pokud v pom.xml zakomentujeme (nebo odstaníme) <scope>test</scope>, vše bude v pořádku.

Napsat komentář