Ich versuche, Junit-Tests für eine Klasse mit zwei überladenen Methoden zu schreiben. Hier ist mein Code im Test
public class Solution {
public static String getDurationString(int minute, int seconds) {
if (minute < 0) {
return "Invalid Value";
} else if (seconds < 0 || seconds > 59) {
return "Invalid Value";
} else {
int hours = minute / 60;
minute %= 60;
return getTimeString(hours) + "h " + getTimeString(minute) + "m " + seconds + "s";
}
}
public static String getDurationString(int seconds) {
if (seconds < 0) {
return "Invalid Value";
}
int minutes = seconds / 60;
seconds %= 60;
int hours = minutes / 60;
minutes %= 60;
return getTimeString(hours) + "h " + getTimeString(minutes) + "m " + seconds + "s";
}
//returns value in xx format
private static String getTimeString(int val) {
if (val < 10) {
return "0" + val;
}
return "" + val;
}
}
Ich kann die Funktion getDurationString (min, sec) anhand einiger Daten mit dem parametrisierten Runner von JUnit testen. Ich möchte denselben Testcode verwenden, um einen Test für die Funktion getDurationString (sec) zu schreiben, bin mir aber nicht sicher, wie ich das machen soll. Ich habe mir eine Stackoverflow-Frage angesehen, aber sie hilft nicht (möglicherweise, weil ich JUnit4 verwende).
Irgendeine Idee, wie dies mit JUnit4 erreicht werden kann?
UPDATE: Testcode als Referenz hinzugefügt
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class)
class SolutionTest {
@Parameterized.Parameters(name = "Test{index} -> {0} min {1} sec returns {2}")
public static Iterable<Object[]> dataForTwoParameterMethod() {
return Arrays.asList(new Object[][]{
{-1, 10, "Invalid Value"}, //minutes < 0 returns "Invalid value"
{1, -1, "Invalid Value"}, //Negative seconds value
{61, 50, "01h 01m 50s"}, //valid value returns time in format "XXh YYm ZZs"
});
}
int minute;
int seconds;
String durationString;
public SolutionTest(int minute, int seconds, String durationString) {
this.minute = minute;
this.seconds = seconds;
this.durationString = durationString;
}
@Test
public void getDurationString() {
assertEquals(durationString, Solution.getDurationString(minute, seconds));
}
@Test @Ignore("TODO: Not able to find a way to inject two different data into one JUnit Test")
public void testGetDurationString() {
//TODO: how to use two data in single data driven test
}
}
Wenn ich Sie richtig verstehe, haben Sie einen Satz von Parametern:
{-1, 10, "Invalid Value"}, //minutes < 0 returns "Invalid value"
{1, -1, "Invalid Value"}, //Negative seconds value
{61, 50, "01h 01m 50s"}, //valid value returns time in format "XXh YYm ZZs"
mit denen Sie die Methode mit zwei Argumenten testen getDurationString
. Und - so verstehe ich - möchten Sie vielleicht auch einen zweiten Parametersatz bereitstellen
{-1, "Invalid Value"}, //seconds < 0 returns "Invalid value"minutes, "
{0, "00h 00m 00s"}, //boundary case, everything zero
{1, "00h 00m 01s"}, //last digit (seconds)
{10, "00h 00m 10s"}, //but last digit (seconds)
{59, "00h 00m 59s"}, //boundary case
{60, "00h 01m 00s"}, //boundary case, last digit (minutes)
...
um die Ein-Argument-Methode zu testen getDurationString
. Um dies mit JUnit4 zu tun, müssen Sie jedoch eine zweite Testklasse erstellen - Sie können nicht zwei verschiedene Parametersätze in dieselbe Klasse einfügen.
Sie können in einer Klasse mit parametrisierten Tests viele Testmethoden haben - aber alle arbeiten mit demselben Parametersatz, wie unter definiert @Parameterized.Parameters
.
Beachten Sie, dass sich dies von der Art und Weise unterscheidet, wie parametrisierte Tests in JUnit5 implementiert werden: In JUnit5 kann für jede einzelne parametrisierte Testmethode separat entschieden werden, welche Eingabeparameter die Testmethode erhalten soll. Dazu werden jede Testmethode mit den Informationen versehen, aus denen die Testdaten stammen: https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen