Как сравнить с оптимальным усилием ли 2 JAVA ВЛОЖЕННЫХ КОЛЛЕКЦИЙ данного формата Список > равны - PullRequest
0 голосов
/ 29 мая 2020

Как сравнить с оптимальным усилием, равны ли 2 JAVA ВЛОЖЕННЫХ КОЛЛЕКЦИЙ этого формата List<Map<String, Object>>

В List<Map<String, Object>> Объект может быть List или Map

Мне нужно написать модульные тесты для сравнения значений вложенного объекта коллекции, проанализированного из json, и ожидаемого значения (другая коллекция, которую я создаю вручную). Я могу делать это итеративно, углубляясь в каждый из объектов и сравнивая их со значениями из другой коллекции.

Но этот подход кажется очень утомительным, поскольку мне приходится повторять каждый тестовый пример.

Есть ли другой эффективный подход?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Это именно то, для чего предназначен assertEquals.

assertEquals(expected, actual);

Это затруднит отладку, если что-то go неправильно.

В зависимости от того, как структурирован ваш код, вы может быть лучше использовать макет для части синтаксического анализа json и проверять только то, что ваш код передает ожидаемые значения синтаксическому анализатору.

Если ничего другого, вместо создания второй коллекции, почему не просто утверждать там ценности? Если вы вручную «создаете» ожидаемую коллекцию, вы можете вместо этого вручную проверить возвращенную коллекцию.

0 голосов
/ 29 мая 2020

Как указано в @Holger, это неэффективно!

package im.silentsudo.gradletest;

import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.junit.Assert;
import org.junit.Test;

import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HashComparisionTest {

    @AllArgsConstructor
    @NoArgsConstructor
    static class Post {
        Long id;
        String title;
    }

    static private Map<String, Object> generateUser1PostList() {
        final List<ComparisionMain.Post> posts = new ArrayList<>();
        posts.add(new ComparisionMain.Post(1L, "Post 1"));
        posts.add(new ComparisionMain.Post(2L, "Post 2"));
        final Map<String, Object> userPosts = new HashMap<>();
        userPosts.put("user_a", posts);
        return userPosts;
    }

    static private Map<String, Object> generateUser2PostList() {
        final List<ComparisionMain.Post> posts = new ArrayList<>();
        posts.add(new ComparisionMain.Post(20L, "Post 20"));
        posts.add(new ComparisionMain.Post(21L, "Post 21"));
        final Map<String, Object> userPosts = new HashMap<>();
        userPosts.put("user_b", posts);
        return userPosts;
    }

    static private String getHash(String content) throws NoSuchAlgorithmException {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(content.getBytes());
        byte[] digiest = messageDigest.digest();
        return DatatypeConverter.printHexBinary(digiest);
    }


    @Test
    public void testTwoCollectionMeaningfullyEquals() throws NoSuchAlgorithmException {
        System.out.println("------------- testTwoCollectionMeaningfullyEquals --------------");
        final Gson gson = new Gson();
        List<Map<String, Object>> collection1 = new ArrayList<>();
        List<Map<String, Object>> collection2 = new ArrayList<>();

        collection1.add(generateUser1PostList());

        collection2.add(generateUser1PostList());

        final String hash1 = getHash(gson.toJson(collection1));

        System.out.println(hash1);
        final String hash2 = getHash(gson.toJson(collection2));
        System.out.println(hash2);

        Assert.assertEquals(hash1, hash2);

        System.out.println("------------- testTwoCollectionMeaningfullyEquals --------------");
    }

    @Test
    public void testTwoCollectionMeaningfullyNotEquals() throws NoSuchAlgorithmException {
        System.out.println("------------- testTwoCollectionMeaningfullyNotEquals --------------");
        final Gson gson = new Gson();
        List<Map<String, Object>> collection1 = new ArrayList<>();
        List<Map<String, Object>> collection2 = new ArrayList<>();

        collection1.add(generateUser1PostList());

        collection2.add(generateUser2PostList());

        final String hash1 = getHash(gson.toJson(collection1));

        System.out.println(hash1);
        final String hash2 = getHash(gson.toJson(collection2));
        System.out.println(hash2);

        Assert.assertNotEquals(hash1, hash2);

        System.out.println("------------- testTwoCollectionMeaningfullyNotEquals --------------");
    }
}

Вывод вышеуказанной программы:

Testing started at 12:01 PM ...
> Task :cleanTest
> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
------------- testTwoCollectionMeaningfullyNotEquals --------------
766461F7DB37B8EC031BE0145E6832D3
156636D7A2CF2196783F9D644A994391
------------- testTwoCollectionMeaningfullyNotEquals --------------
------------- testTwoCollectionMeaningfullyEquals --------------
766461F7DB37B8EC031BE0145E6832D3
766461F7DB37B8EC031BE0145E6832D3
------------- testTwoCollectionMeaningfullyEquals --------------
BUILD SUCCESSFUL in 0s
4 actionable tasks: 3 executed, 1 up-to-date
12:01:49 PM: Tasks execution finished ':cleanTest :test --tests "im.silentsudo.gradletest.HashComparisionTest"'.

Это очень простая реализация, если вам нужно подробнее о сравнении объектов в java см. https://www.baeldung.com/java-equals-hashcode-contracts

...