@Parameter in Junit 4
-
05-07-2019 - |
Frage
Kann ich mehr als eine Methode mit @Parameter in JUnit-Testklasse, die mit Parameterized Klasse ausgeführt wird?
@RunWith(value = Parameterized.class)
public class JunitTest6 {
private String str;
public JunitTest6(String region, String coverageKind,
String majorClass, Integer vehicleAge, BigDecimal factor) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data1() {
Object[][] data = {{some data}}
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized str is : " + str);
str = null;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some other data}}
return Arrays.asList(data);
}
@Test
public void pullTest() {
System.out.println("Parameterized new str is : " + str);
str = null;
}
}
Lösung
Sie können die Theories Läufer (Suche nach dem Wort Theorien dass link) verschiedene Parameter zu verschiedenen Methoden zu übergeben.
Andere Tipps
Wahrscheinlich die data1
Methode, aber keine Garantie für das, wird es verwenden, je nachdem, welche die JVM gibt junit4 zuerst.
Hier ist der relevante Code aus junit:
private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception {
List<FrameworkMethod> methods= testClass.getAnnotatedMethods(Parameters.class);
for (FrameworkMethod each : methods) {
int modifiers= each.getMethod().getModifiers();
if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))
return each;
}
throw new Exception("No public static parameters method on class " + testClass.getName());
}
So ist die erste öffentliche, statische kommentierten Methode, die es verwendet wird findet, aber es kann sie in beliebiger Reihenfolge finden.
Warum haben Sie uour Test auf diese Weise geschrieben? Sie sollten nur eine @Parameters
-kommentierten Methode haben.
Es ist nicht mehr als ein Datum Verfahren zu haben, bezeichnet. Sie können es in skaffman Antwort .
Warum ist es nicht vorgesehen, zwei Daten Methoden zu implementieren?
Die Antwort könnte lauten:. Die Kupplung
Ist es zu komplex diesen Test aufgeteilt in zwei Testfälle? Sie wäre in der Lage, eine kleine Erbschaft und teilen gemeinsame Methoden einzuführen. Mit zwei Testfälle können Sie zwei getrennte Daten Methoden zur Verfügung stellen und Ihre Sachen testen sehr gut.
Ich hoffe, es hilft.
Sie können für jeden Satz von Methoden innere Klassen erstellen, die auf den gleichen Parametern arbeiten. Zum Beispiel:
public class JunitTest6 {
@RunWith(value = Parameterized.class)
public static class PushTest{
private String str;
public PushTest(String region) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some data}}
return Arrays.asList(data);
}
@Test
public void pushTest() {
System.out.println("Parameterized str is : " + str);
str = null;
}
}
@RunWith(value = Parameterized.class)
public static class PullTest{
private String str;
public PullTest(String region) {
this.str = region;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = {{some other data}}
return Arrays.asList(data);
}
@Test
public void pullTest() {
System.out.println("Parameterized new str is : " + str);
str = null;
}
}
}