Mockito - Moqueur Classes Concrètes

Donné le code suivant:

    LinkedList list = mock(LinkedList.class);
    doCallRealMethod().when(list).clear();
    list.clear();

par l'exécution de ce test, une NullPointerException est levée à partir de la première ligne dans la LinkedList#claire:

public void clear() {
    Entry<E> e = header.next;
    while (e != header) {
        Entry<E> next = e.next;
        //Code omitted. 

mais en-tête a été instancié avant:

private transient Entry<E> header = new Entry<E>(null, null, null);

Quelqu'un pourrait-il expliquer ce qui se passe au cours de se moquer de la création?

####### La mise à JOUR. ######

Avoir lu toutes les réponses, surtout Ajay, j'ai regardé dans Objenesis code source et savoir que c'est à l'aide de la Réflexion de l'API pour créer le proxy de l'instance (par CGLIB) et, par conséquent, en contournant tous les constructeurs dans la hiérarchie jusqu'à java.lang.Objet.

Voici un exemple de code pour simuler la question:

public class ReflectionConstructorTest {

    @Test
    public void testAgain() {

        try {
            //java.lang.Object default constructor
            Constructor javaLangObjectConstructor = Object.class
                    .getConstructor((Class[]) null);
            Constructor mungedConstructor = ReflectionFactory
                    .getReflectionFactory()
                    .newConstructorForSerialization(CustomClient.class, javaLangObjectConstructor);

            mungedConstructor.setAccessible(true);

            //Creates new client instance without calling its constructor
            //Thus "name" is not initialized.
            Object client = mungedConstructor.newInstance((Object[]) null);

            //this will print "CustomClient" 
            System.out.println(client.getClass());
            //this will print "CustomClient: null". name is null.
            System.out.println(client.toString());

        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}


class CustomClient {
    private String name;

    CustomClient() {
        System.out.println(this.getClass().getSimpleName() + " - Constructor");
        this.name = "My Name";
    }

    @Override
    public String toString() {
        return this.getClass().getSimpleName() + ": " + name;
    }
}
nous montrer plein stacktrace

OriginalL'auteur mhshams | 2013-01-17