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

У класса A есть внутренний класс B. Класс A имеет частный список объектов класса B, которые он делает доступными через методы getB, addB и removeB. Как выполнить модульное тестирование метода removeB?

Я надеялся создать два одинаковых имита класса B, добавить каждый, а затем удалить один из них дважды (в результате были удалены оба). Однако с тех пор я узнал из-за неудач, что метод equals не будет вызываться для фиктивных объектов.

Было ли глупо (или невозможно) пытаться изолировать внешний класс от его внутреннего для модульного тестирования?


Пример кода следует за

Класс для тестирования:

import java.util.ArrayList;
import java.util.List;

public class Example {
    private List<Inner> inners = new ArrayList<Inner>();

    public List<Inner> getInners() {
        return inners;
    }

    public void addInner(Inner i) {
        inners.add(i);
    }

    public void removeInner(Inner i) {
        inners.remove(i);
    }

    /**
     * equalityField represents all fields that are used for testing equality
     */
    public class Inner {
        private int equalityField;
        private int otherFields;

        public int getEqualityField() {
            return equalityField;
        }

        public Inner(int field) {
            this.equalityField = field;
        }

        @Override
        public boolean equals(Object o) {
            if (o == null)
                return false;
            if (o.getClass() != this.getClass())
                return false;
            Inner other = (Inner) o;
            if (equalityField == other.getEqualityField())
                return true;
            return false;
        }
    }
}

Тестовый пример, который не сработал, поэтому отлично:

import static org.junit.Assert.*;
import org.junit.Test;
import org.easymock.classextension.EasyMock;

public class ExampleTest {
    @Test
    public void testRemoveInner() {
        Example.Inner[] mockInner = new Example.Inner[2];
        mockInner[0] = EasyMock.createMock(Example.Inner.class);
        mockInner[1] = EasyMock.createMock(Example.Inner.class);        

        Example e = new Example();
        e.addInner(mockInner[0]);
        e.addInner(mockInner[1]);
        e.removeInner(mockInner[0]);
        e.removeInner(mockInner[0]);
        assertEquals(0, e.getInners().size());
    }
}
5
задан Matt 24 November 2011 в 18:01
поделиться