Maven Project — использование LinkedHashMap и LinkedHashSet вместе с тестированием JUnit

Опубликовано: 19 Февраля, 2023

В программировании программного обеспечения во многих случаях нам необходимо использовать LinkedHashMap и LinkedHashSet.

LinkedHashSet

Хотя HashSet доступен, если нам нужна упорядоченная версия HashSet, нам нужен LinkedHashSet. Преимущество заключается в том, что когда мы повторяем LinkedHashSet, мы получаем отображение элементов в том порядке, в котором они были вставлены. Из-за существования методов equals и hashcode дублирование данных не допускается.

LinkedHashMap

Хотя HashMap доступен, если нам нужна заказанная версия HashMap, нам понадобится LinkedHashMap. Преимущество заключается в том, что когда мы повторяем LinkedHashMap, мы получаем отображение элементов в том порядке, в котором они были вставлены. Хотя допускаются дубликаты ключей, перезапись будет происходить с новыми значениями вместо старых значений. С помощью примера проекта maven давайте посмотрим весь проект. Давайте возьмем «GeekArticles» как класс компонента, содержащий несколько атрибутов, а именно

  • статьяИмя
  • идентификатор статьи
  • опубликовано
  • рейтинг
  • имя автора

Пример проекта Maven

Структура проекта:

Maven Project и, следовательно, необходимые зависимости указаны в

пом.xml

XML




<?xml version="1.0" encoding="UTF-8"?>
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
  
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.gfg.LinkedCollectionServicesInJava</groupId>
    <artifactId>LinkedCollectionServicesInJava</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
  
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>5.3.1</junit.version>
        <pitest.version>1.4.3</pitest.version>
    </properties>
  
    <dependencies>
  
        <!-- junit 5, unit test -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
  
    </dependencies>
    <build>
        <finalName>maven-mutation-testing</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M1</version>
            </plugin>
  
            <plugin>
                <groupId>org.pitest</groupId>
                <artifactId>pitest-maven</artifactId>
                <version>${pitest.version}</version>
  
                <executions>
                    <execution>
                        <id>pit-report</id>
                        <phase>test</phase>
                        <goals>
                            <goal>mutationCoverage</goal>
                        </goals>
                    </execution>
                </executions>                
                <!-- Need this to support JUnit 5 -->
                <dependencies>
                    <dependency>
                        <groupId>org.pitest</groupId>
                        <artifactId>pitest-junit5-plugin</artifactId>
                        <version>0.8</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <targetClasses>
                        <param>com.gfg.LinkedCollectionServicesInJava.*LinkedCollectionServicesInJava*</param>
                    </targetClasses>
                    <targetTests>
                        <param>com.gfg.LinkedCollectionServicesInJava.*</param>
                    </targetTests>
                </configuration>
            </plugin>
  
        </plugins>
    </build>
  
</project>

Класс бобов

GeekArticles.java

Java




public class GeekArticles {
    public GeekArticles(String articleName, int articleId, String publishedUnder, int rating, String authorName) {
        super();
        this.articleName = articleName;
        this.articleId = articleId;
        this.publishedUnder = publishedUnder;
        this.rating = rating;
        this.authorName = authorName;
    }
  
    public GeekArticles() {
        // via setter methods, rest fields are done
    }
  
    String articleName;
    int articleId;
    String publishedUnder;
    int rating;
    String authorName;    
  
    public String getArticleName() {
        return articleName;
    }
  
    public void setArticleName(String articleName) {
        this.articleName = articleName;
    }
  
    public int getArticleId() {
        return articleId;
    }
  
    public void setArticleId(int articleId) {
        this.articleId = articleId;
    }
  
    public String getPublishedUnder() {
        return publishedUnder;
    }
  
    public void setPublishedUnder(String publishedUnder) {
        this.publishedUnder = publishedUnder;
    }
  
    public int getRating() {
        return rating;
    }
  
    public void setRating(int rating) {
        this.rating = rating;
    }
  
    public String getAuthorName() {
        return authorName;
    }
  
    public void setAuthorName(String authorName) {
        this.authorName = authorName;
    }
  
    // We need to override 2 methods namely 
    // equals and hashcode whenever we no need
    // to store two article objects     
    // if their names are same
    @Override
    public boolean equals(Object o) {
        if (o instanceof GeekArticles) {
            GeekArticles other = (GeekArticles) o;
            return articleName.equals(other.getArticleName());
        }
  
        return false;
    }
  
    @Override
    public int hashCode() {
        return articleName.hashCode();
    }
  
}

Вот два важных метода, которые мы должны отметить: Из-за существования метода «равно», который проверяет сходство articleName и выясняет, есть ли дубликаты. Кроме того, функция hashCode() дает хэш-код проверенного articleName. При этом он запрещает дубликаты. Если они закомментированы, в случае с LinkedHashSet разрешены дубликаты. Следовательно, необходимо добавить эти 2 метода в обязательном порядке.

LinkedHashMapSample.java

Java




import java.util.LinkedHashMap;
  
public class LinkedHashMapSample {
    // In order to represent LinkedHashMap does not allow 
    // duplicates in a LinkedHashMap for the same key "Excellent",
    // two separate article data is added
    // Though adding is allowed, instead of keeping 
    // 3 different entries, only 2 will be the size and for
    // "Excellent" key, last data is updated
    public int addArticles(LinkedHashMap articleMap) 
    {
        articleMap.put("Excellent",new GeekArticles("DSA", 1, "DSA", 10,"GeekA"));
        articleMap.put("Best",new GeekArticles("JavaProgramming", 2, "Java", 9,"GeekA")); 
        articleMap.put("Excellent",new GeekArticles("SoftwareTesting", 3, "Testing", 10,"GeekB")); 
        return articleMap.size();
    }
    public int getArticles(LinkedHashMap articles) {
        return articles.size();
    }
    public String getArticleName(LinkedHashMap articleMap,String articleNameKey) {
        GeekArticles geekArticles = new GeekArticles();
        if (articleMap.containsKey(articleNameKey)) {
            // Mapping the retrieved value
            geekArticles = (GeekArticles) articleMap.get(articleNameKey);            
        }
        return geekArticles.getArticleName();
    }
    public String getAuthorName(LinkedHashMap articleMap,String articleNameKey) {
        GeekArticles geekArticles = new GeekArticles();
        if (articleMap.containsKey(articleNameKey)) {
            // Mapping the retrieved value
            geekArticles = (GeekArticles) articleMap.get(articleNameKey);            
        }
        return geekArticles.getAuthorName();
    }
}

LinkedHashSetSample.java

Java




import java.util.LinkedHashSet;
  
public class LinkedHashSetSample {    
    public int addArticlesViaLinkedHashSet(LinkedHashSet articleSet) 
    {
        GeekArticles dsa = new GeekArticles("DSA", 1, "DSA", 10,"GeekA");
        GeekArticles javaProgramming = new GeekArticles("JavaProgramming", 1, "Java", 9,"GeekA");
        GeekArticles dsaProgramming = new GeekArticles("DSA", 1, "DSA", 10,"GeekB");
        articleSet.add(dsa);
        articleSet.add(javaProgramming); 
        articleSet.add(dsaProgramming);        
        return articleSet.size();
    }
    public int getArticles(LinkedHashSet articlesSet) {
        return articlesSet.size();
    }
      
    public String getArticleName(LinkedHashSet article,GeekArticles geekArticle) {
        if (article.contains(geekArticle)) {
            // Mapping the retrieved value
            return geekArticle.getArticleName();            
        }
        return null;
    }
    public String getAuthorName(LinkedHashSet article,GeekArticles geekArticle) {
        if (article.contains(geekArticle)) {
            // Mapping the retrieved value
            return geekArticle.getAuthorName();            
        }
        return null;
    }
}

Теперь пришло время проверить, верны ли наши предположения. Автоматизированное тестирование, такое как JUnit, всегда полезно для подтверждения того же самого. Давайте посмотрим на приведенный ниже набор кода.

TestLinkedCollectionServicesJava.java

Java




import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
  
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
  
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
  
public class TestLinkedCollectionServicesJava {
    @DisplayName("Test check for adding geekarticles in LinkedHashMap collection ")
    @Test