首页 > 解决方案 > 在某些情况下我应该如何使用模拟?

问题描述

假设有如下类:

CivilAddSystem 类:

class CivilAddSystem{

    List<People> people = new ArrayList<>();
    List<Town> towns = new ArrayList<>();

    public People addPeople(People people) {
        people.add(people);
        return people;
    }

    public Town addTown(Town town) {
        towns.add(town);
        return town;
    }

    public House addHouse (House house, String townName) throws IllegalStateException {
        
        Town town = getTown(townName);
        if (null == town) throw new IllegalStateException("No matching town");

        town.addHouse(house);
        return house;
    }

public List<String> getTown(String name) {

        for (Town town : towns) {
            if (town.getName().equals(name)) return town;
        }

        return null;
    }
}

镇级:

public class Town {
    List<House> houses = new ArrayList<>();

    String name;
    String abbreviation;

    public Town (String name, String abbreviation) {
      
        this.name = name;
        this.abbreviation = abbreviation;
    }
    
    public String getName() {
        return name;
    }
    
    public String getAbbreviation() {
        return abbreviation;
    }
    
    public void addHouse(House house) {
        houses.add(house);
    }
    
    public House getHouse(String unitNumber) {
        for (House house : houses) {
            if (house.getUnitNumber().equals(unitNumber)) return house;
        }

        return null;
    }
}

房屋类

public class House {
    private final List<People> people = new ArrayList<>();

    private final String unitNumber;
    private final String houseName;

    public House (String unitNumber, String houseName) {

        this.unitNumber= unitNumber;
        this.houseName= houseName;
    }

    public String getUnitNumber() {
        return unitNumber;
    }

    public String getHouseName() {
        return houseName;
    }

    private People checkMovedInPeople(People person) {
        if (null == person) throw new NullPointerException();

        for (People movedIn : people) {
            if (movedIn.getName().equals(person.getName())) return movedIn;
            if (movedIn.getPersonID().equals(person.getPersonID())) return movedIn;
        }

        return null;
    }

    public void moveInPeople(People person) throws IllegalArgumentException, IllegalStateException {
         if (null == person) throw new IllegalArgumentException("Person shouldn't be null");
         if (null != checkMovedInPeople(person)) throw new IllegalStateException("Person is already in the house");

         people.add(person);
    }

    public List<String> getPeople() {
        List<String> results = new ArrayList<>();

        for (People person: people) {
            results.add(person.getPersonID());
        }

        return results;
    }

    public People getPerson(String match) {
        for (People person: people) {
            if (person.getPersonID().equals(match)) return person;
            if (person.getName().equals(match)) return person;
        }

        return null;
    }
}

而对于people 类,它只有两个变量:String PersonID 和 String Name 以及它们的 getter 方法。

所以,我想要实现的是,我目前正在尝试测试 CivilAddSystem 类中的 addPeople 方法,并且我想使用 mockito 独立测试它。

我使用 JUnit 编写的测试用例是这样的:

@Test
    public void testAddPeople() {
        CivilAddSystem CAS = new CivilAddSystem();
        Town town = CAS.addTown("BlueTown", "BT");
        House house = CAS.addHouse("U180", "BlueHouse", "BlueTown");
        People bob = CAS.addPeople("1", "Bob");
        Assert.assertEquals(CAS.getTown("BlueTown").getHouse("U180").getPerson("1"), null);

        house.moveInPeople(bob);
        Assert.assertEquals(CAS.getTown("BlueTown").getHouse("U180").getPerson("1").getPersonID, 1);
    }

但我真的很难为这个测试用例应用 mockito。

到目前为止,我所做的只是嘲笑 Town、House 和 People 类(不是 CivilAddSystem 类,因为它是正在测试的类),然后停在那里......

谁能给我一个关于如何为上述测试用例应用 mockito 的提示?

ps) 对上面的代码进行一些修改是可以接受的(例如,应用依赖注入和类似的东西是可以接受的)。

提前致谢!

标签: javajunitmockingmockito

解决方案


推荐阅读