2016-05-06 6 views
2

ich folgenden Code haben die Vorbereitung spottet mein Service zu testen Cassandra mit (Ich brauche com.datastax.driver.core.ColumnDefinitions.Definition zu verspotten):Mocking ColumnDefinitions.Definition Mock zurückkehrt, ist aber verhält sich wie null in der getesteten Code

@RunWith(PowerMockRunner.class) 
public class TestMyClass{ 
private MyClass target; 
    @Before 
    public void setUp() throws Exception { 
    ColumnDefinitions mockColumnDefinitions=Mockito.mock(ColumnDefinitions.class); 
    Mockito.when(mockRow.getColumnDefinitions()).thenReturn(mockColumnDefinitions); 
    target= new MyClass(); 
    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 
public void testMyMethod() throws Exception { 
    target.MyMethod(); 
} 
} 

Testausführung geht schön diesen Ort, und ich habe diese Art von Code an verschiedenen Orten, so sollte es funktionieren. Innerhalb des Service, den ich teste ich folgenden Code haben:

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

Wenn ich diesen Code debuggen, ich sehe, dass beide colDef und defIterator erfolgreich verspottet werden. Ich sehe so etwas wie die im Debug-Variablen Bereich:

Mock for Iterator, hashCode: 430126690 

Aber nach defIterator.next() Aufruf ich sehe, dass obwohl def ein Objekt ist und nicht null ist, es nicht hashcode besagt wie für Iterator, stattdessen sehe ich:

com.sun.jdi.InvocationException occurred invoking method. 

und nach dieser Zeichenfolge Aufruf:

String columnName = def.getName(); 

ich sofort NullPointerException wie wenn def nu ll. Was mache ich falsch? Danke.

EDIT 1 ________________________________________________________________________

Ich habe auch versucht stattdessen PowerMockito mit den gleichen Methoden zu verwenden, das Ergebnis ist das gleiche.

EDIT 2 ________________________________________________________________________

habe ich den ganzen Testmethode Code.

+0

Können Sie kopieren die vollständige Testmethode? – doanduyhai

+0

@doanduyhai Bitte überprüfen, fügte ich hinzu, was herum ist. –

Antwort

2

Es ist eine Weile her, seit diese Frage erstellt wurde. Ich habe das gleiche Problem wenigen Tagen konfrontiert vor und ich habe es in der folgenden Art und Weise gelöst (ich hoffe, dass meine vorgeschlagene Lösung jemand in der Zukunft hilft):

Zunächst einmal möchte ich klarstellen, dass ColumnDefinition.Definition Klasse ist eine public static verschachtelte Klasse, die vier private final Felder hat und nur einen Konstruktor hat: Definition (String keyspace, String table, String name and DataType type) (für weitere Details beziehen Sie sich bitte auf die ColumnDefinitions.Definition javadoc und ColumnDefinitions source code). Daher konnte diese verschachtelte Klasse aufgrund ihrer final Felder weder durch Mockito noch Powermock verspottet werden.

LÖSUNG:

Ich hatte ein reales Objekt zu schaffen, kein verspottet eine der Klasse ColumnDefinition.Definition Reflexion verwendet wird, so können Sie das mockDef Objekt initialisieren wie folgt:

Constructor<Definition> constructor = (Constructor<Definition>) Definition.class.getDeclaredConstructors()[0]; // as Definition only has one constructor, 0 will be passed as index 
constructor.setAccessible(true); 
Definition mockDef = constructor.newInstance("keyspace", "table", "name", null); 

diese ersetzen Zeile des Codes in Ihrem Schnipsel:

Definition mockDef = Mockito.mock(Definition.class); 

Dann die NullPoi nterException wird nie wieder beim Ausführen dieser Codezeile ausgelöst:

String columnName = def.getName();