4 votes

Comment comparer deux listes avec JUnit

J'essaie de comparer deux tableaux de chaînes de caractères avec la syntaxe Java 8.

List<String> days= dayPartsList.get(0).getWeekdays()
                .stream()
                .sorted(Comparator.comparing(WeekdayModel::getName))
                .map(x -> x.getName().toUpperCase())
                .collect(Collectors.toList());
List<DayOfWeek> daysofWeeks =Arrays
                .stream(DayOfWeek.values())
                .sorted(Comparator.comparing(x -> x.getDisplayName(TextStyle.FULL, Locale.CANADA)))
                .collect(Collectors.toList());

assertEquals(days,daysofWeeks);

Lorsque j'exécute le code, j'obtiens l'erreur suivante dans la console.

java.lang.AssertionError: expected: java.util.ArrayList<[FRIDAY, MONDAY, SATURDAY, SUNDAY, THURSDAY, TUESDAY, WEDNESDAY]> but was: java.util.ArrayList<[FRIDAY, MONDAY, SATURDAY, SUNDAY, THURSDAY, TUESDAY, WEDNESDAY]>
Expected :java.util.ArrayList<[FRIDAY, MONDAY, SATURDAY, SUNDAY, THURSDAY, TUESDAY, WEDNESDAY]> 
Actual   :java.util.ArrayList<[FRIDAY, MONDAY, SATURDAY, SUNDAY, THURSDAY, TUESDAY, WEDNESDAY]>
 <Click to see difference>

    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:743)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at com.monkey.service.intergrationTest.MenuCallTest.readGetDayPartsTest(MenuCallTest.java:93)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:233)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:176)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70

Les résultats réels et attendus sont identiques, mais le test échoue toujours. Quelqu'un a-t-il une idée de ce qui se passe ici ? Merci

4voto

davidh Points 107

Premièrement, votre problème n'est vraiment pas spécifique à java 8 Stream s comme ici, vous voulez comparer les List collectées par l Stream et non les Stream eux-mêmes.

Les résultats réels et attendus sont identiques, mais le test est le suivant échoue toujours.

En effet, ils semblent avoir le même "contenu" mais en fait, ce n'est pas le cas puisque dans votre code de test vous n'affirmez pas que deux String sont égaux mais vous affirmez qu'un List<String> est égal à un List<DayOfWeek> .
Le message convivial associé à l'échec du test n'est qu'une représentation textuelle des objets comparés.

Assert.assertEquals(Object, Object) invoque le equals() sur le premier argument pour déterminer si les deux objets sont égaux :

public class Assert {
    ...    
    private static boolean isEquals(Object expected, Object actual) {
        return expected.equals(actual);
    }
    ...    
}

Et un DayOfWeek quel que soit son toString() n'est très probablement pas égale en termes de equals() à une méthode String qui a le même String contenu.

Ainsi, vous devez utiliser le même type d'élément dans la section List dans l'attendu et le réel pour faire assertEqual() réussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X