vendredi 6 mai 2016

Mocking ColumnDefinitions.Definition does return mock, but is behaves like null in the tested code

I have following code preparing mocks to test my service using Cassandra:

        ColumnDefinitions mockColumnDefinitions = Mockito.mock(ColumnDefinitions.class);
        Mockito.when(mockRow.getColumnDefinitions()).thenReturn(mockColumnDefinitions);
        Definition mockDef = Mockito.mock(Definition.class);
        List<Definition> defList = new ArrayList<Definition>();
        defList.add(mockDef);

        Iterator mockIterator = Mockito.mock(Iterator.class);
        Mockito.when(mockColumnDefinitions.iterator()).thenReturn(mockIterator);
        Mockito.when(mockIterator.hasNext()).thenReturn(true, false);
        Mockito.when(mockIterator.next()).thenReturn(mockDef);
        Mockito.when(mockDef.getName()).thenReturn(NAME);

Test execution goes fine this place, and I have this type of code in different places, so it should work. Inside the service I am testing I have following code:

ColumnDefinitions colDef = row.getColumnDefinitions();
Iterator<Definition> defIterator = colDef.iterator();
while (defIterator.hasNext()) {
    Definition def = defIterator.next();
    String columnName = def.getName();
}

When I debug this code, I see, that both colDef and defIterator are mocked successfully. I see something like that in debug variables area:

Mock for Iterator, hashCode: 430126690

But after defIterator.next() invocation I see that though def is an object and not null, it doesn't show hashcode like for Iterator, instead I see this:

com.sun.jdi.InvocationException occurred invoking method.

And after invoking this string:

String columnName = def.getName();

I immediately get NullPointerException like if def is null. What am I doing wrong? Thanks.

Aucun commentaire:

Enregistrer un commentaire