diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java new file mode 100644 index 0000000000..bf33a0ba7a --- /dev/null +++ b/junit5/src/test/java/com/baeldung/DynamicTestsExample.java @@ -0,0 +1,129 @@ +package com.baeldung; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.junit.jupiter.api.function.ThrowingConsumer; + +public class DynamicTestsExample { + + @TestFactory + Collection dynamicTestsWithCollection() { + return Arrays.asList( + DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), + DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))); + } + + @TestFactory + Iterable dynamicTestsWithIterable() { + return Arrays.asList( + DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), + DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))); + } + + @TestFactory + Iterator dynamicTestsWithIterator() { + return Arrays.asList( + DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), + DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))) + .iterator(); + } + + @TestFactory + Stream dynamicTestsFromIntStream() { + return IntStream.iterate(0, n -> n + 2).limit(10).mapToObj( + n -> DynamicTest.dynamicTest("test" + n, () -> assertTrue(n % 2 == 0))); + } + + @TestFactory + Stream dynamicTestsFromStream() { + + // sample input and output + List inputList = + new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + List outputList = + new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + + // input generator that generates inputs using inputList + Iterator inputGenerator = new Iterator() { + + String current; + int size = inputList.size(); + int index = 0; + + @Override + public boolean hasNext() { + if(index == size) { + return false; + } + current = inputList.get(index); + index++; + return true; + } + + @Override + public String next() { + return current; + } + }; + + // a display name generator that creates a different name based on the input + Function displayNameGenerator = (input) -> "Resolving: " + input; + + // the test executor, which actually has the logic of how to execute the test case + DomainNameResolver resolver = new DomainNameResolver(); + ThrowingConsumer testExecutor = (input) -> { + int id = inputList.indexOf(input); + assertEquals(outputList.get(id), resolver.resolveDomain(input)); + }; + + // combine everything and return a Stream of DynamicTest + return DynamicTest.stream(inputGenerator, displayNameGenerator, testExecutor); + } + + @TestFactory + Stream dynamicTestsFromStreamInJava8() { + + DomainNameResolver resolver = new DomainNameResolver(); + + List inputList = + new ArrayList<>(Arrays.asList("www.somedomain.com", "www.anotherdomain.com", "www.yetanotherdomain.com")); + List outputList = + new ArrayList<>(Arrays.asList("154.174.10.56", "211.152.104.132", "178.144.120.156")); + + return inputList.stream().map(dom -> DynamicTest.dynamicTest("Resolving: " + dom, () -> { + int id = inputList.indexOf(dom); + assertEquals(outputList.get(id), resolver.resolveDomain(dom)); + })); + + } + + class DomainNameResolver { + + private Map ipByDomainName = new HashMap<>(); + + DomainNameResolver() { + this.ipByDomainName.put("www.somedomain.com", "154.174.10.56"); + this.ipByDomainName.put("www.anotherdomain.com", "211.152.104.132"); + this.ipByDomainName.put("www.yetanotherdomain.com", "178.144.120.156"); + } + + public String resolveDomain(String domainName) { + return ipByDomainName.get(domainName); + } + } + +}