Man kann Theorien sehr effektiv auf alle möglichen Klassen des System ausdehnen, ohne viel Zusatzarbeit. Die im Beispiel getesteten Eigenschaften bzgl. equals und hashcode müssen auch für alle Klassen gelten. Der Schlüssel hierzu ist eine generische, abstrakte Klasse, von der abgleitet wird.
package theoryexample; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; @RunWith(Theories.class) public abstract class ObjectTest <ClassUnderTest> { @Theory public void symmetrie(ClassUnderTest a, ClassUnderTest b) { assumeTrue(a.equals(b)); assertTrue(b.equals(a)); } @Theory public void reflexivitaet(ClassUnderTest a) { // assumeTrue(true); assertTrue(a.equals(a)); } @Theory public void transitivaet(ClassUnderTest a, ClassUnderTest b, ClassUnderTest c) { assumeTrue(a.equals(b)); assumeTrue(b.equals(c)); assertTrue(a.equals(c)); } @Theory public void equalsHashcode(ClassUnderTest a, ClassUnderTest b) { assumeTrue(a.equals(b)); assertEquals(a.hashCode(), b.hashCode()); } } |
package theoryexample; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import org.junit.Test; import org.junit.experimental.theories.DataPoint; import org.junit.experimental.theories.DataPoints; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; public class DreieckTest extends ObjectTest { @DataPoint public static final Dreieck d1 = new Dreieck(0.0, 0.0, 1.0, 1.0, 2.0, 2.0); @DataPoint public static final Dreieck d2 = new Dreieck(0.5, 0.5, 1.5, 1.5, 2.5, 2.5); @DataPoint public static final Dreieck d3 = new Dreieck(0.0, 0.0, 1.0, 1.0, 3.0, 3.0); @DataPoint public static final Dreieck d4 = new Dreieck(0.0, 0.0, -1.0, -2.0, -2.0, -2.0); @DataPoint public static final Dreieck d5 = new Dreieck(0.5, 0.5, 1.5, 1.5, -2.5, -2.5); @DataPoint public static final Dreieck d6 = new Dreieck(-1.0, 0.0, -2.0, -2.0, -3.0, -2.0); @DataPoints public static final Dreieck[] nochmehrDreiecke = { new Dreieck(-1.0, -2.0, -2.0, -2.0, -3.0, 2.0), new Dreieck(-1.0, -1.0, -2.0, -2.0, -4.0, 2.0), new Dreieck(-1.0, 0.0, -2.0, -2.0, -5.0, 2.0), new Dreieck(-1.0, 2.0, -2.0, -2.0, -7.0, 2.0) }; } |
Tags: generische Tests, Java, JUnit, Theory