Manière correcte de l'unité de la classe de test à l'intérieur de la classe

Une classe interne est de classe B. la Classe A a une liste privée de la classe B les objets qu'il met à la disposition par le biais de getBs, addB, et removeB méthodes. Comment puis-je l'unité de test de la removeB méthode?

J'espérais créer deux se moque de la classe B, de l'ajout de chaque, puis supprimez l'un d'eux à deux reprises (pour conséquence de supprimer à la fois). Cependant, depuis j'ai appris par le biais de l'échec que la méthode equals ne sera pas appelé sur les objets fantaisie.

Était-il idiot (ou impossible) de tenter d'isoler l'extérieur de la classe de son intérieur de la classe de test unitaire?


Exemple de code suit

Classe de test:

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;
        }
    }
}

Cas de Test qui ne fonctionne pas si grande:

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());
    }
}
totalement indépendants, utiliser des classes internes si vous n'avez pas besoin d'une référence à l'extérieur de la classe

OriginalL'auteur Matt | 2011-11-24