单元测试:防止创建重复的对象

问题描述 投票:0回答:1

我的教授给了我们这个家庭作业,并创建了一个带有大量单元测试的项目。我们的目标是确保我们可以通过这些单元测试。我们有三节课。一个名为Person的类,其名称和年龄,一个扩展Person的类,以及一个也扩展Person的类Attendee。我正在努力确保没有重复的人。 generateRandomString()由教授实施,只返回一个随机字符串。

我已经创建了类,它是构造函数,getter和setter。我也在类equals()中覆盖Person方法

这是我们教授给我们的考验:

    @Test
    public void testNoDuplicatePerson() {
      HashSet<Person> people = new HashSet<Person>();
      String name = generateRandomString();
      Person p = new Speaker(name);
      people.add(p);
      assertEquals(1,people.size());
      p = new Attendee(name);
      people.add(p);
      assertEquals(1,people.size());
    }

我怎样才能通过这个测试?

编辑:我决定发布三个类的代码:

Person
 ```java
public abstract class Person {
    private String name;
    private int age;

    public Person(String name) {
        this.name = name;
        this.age = 0;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean equals(Object o) {
        if (o == null || !(o instanceof Person))
            return false;
        Person converted = (Person) o;
        if (this.getName().equals(converted.getName()) && this.getAge() == converted.getAge())
            return true;
        return false;
    }
}

扬声器:

public class Speaker extends Person {

    private int fee;

    public Speaker(String name) {
        super(name);
        this.fee = 0;
    }

    public Speaker(String name, int age) {
        super(name, age);
        this.fee = 0;
    }

    public Speaker(String name, int age, int fee) {
        super(name, age);
        this.fee = fee;
    }

    public int getFee() {
        return fee;
    }

    public void setFee(int fee) {
        this.fee = fee;
    }

    public String toString() {
        return "Speaker " + this.getName() + " as a fee value of " + this.getFee() + ".";
    }
}

与会者:

public class Attendee extends Person {
    private boolean paid;

    public Attendee(String name) {
        super(name);
        this.paid=false;
    }

    public Attendee(String name, int age) {
        super(name, age);
        this.paid=false;
    }

    public boolean hasPaid(){
        if (this.paid==true)
            return true;
        return false;
    }
    public String toString(){
        return "Attendee "+this.getName()+(this.hasPaid() ? " has":" hasn't")+" paid its registration.";
    }
}
java unit-testing
1个回答
0
投票

正如@JB Nizet所提到的,当你覆盖类的equals方法时,你必须覆盖hashCode方法。请注意jUnit测试中类的名称:HashSet。这取决于hashCode方法。解: 一个。学习阅读java API文档。这是v8 JavaDocs的链接。阅读HashSet页面。 湾实现hashCode方法。您显然可以访问Internet,因此,如果您不知道如何实现hashCode方法,请尝试谷歌搜索“我如何实现Java hashCode方法”。

提示:String已经实现了hashCode方法。

© www.soinside.com 2019 - 2024. All rights reserved.