2013-02-04 14 views
6

che sto usando Mockito prendere in giro una classe che ha un metodo che sembra qualcosa di simile:Controllo coerenza dei più argomenti utilizzando Mockito

setFoo(int offset, float[] floats) 

io voglio essere in grado di verificare che i valori nella matrice (floats) sono uguali (entro una tolleranza data) ai valori in una matrice di valori attesi.

Il problema è che voglio controllare il contenuto di floats iniziando dalla posizione specificata da offset. Ai fini del test non so/mi interessa quale sia l'offset purché punti ai valori che mi aspetto. Inoltre non mi interessa cosa contiene il resto dell'array. Mi interessa solo i valori che iniziano con l'offset fornito.

Come posso fare?

+0

Forse sono solo io, ma non capisco la tua domanda. Qual è il problema con la scrittura del proprio metodo che considera offset e 2 array come argomenti e verifica che gli elementi di questi array che iniziano con l'offset siano uguali? –

+0

@AndrewLogvinov come faccio a "scrivere il mio metodo" su un oggetto mockito mockito? –

+0

Non penso che nemmeno tu dovresti. Dopo aver chiamato 'setFoo()' ti aspetti che lo stato dell'oggetto sia cambiato. Quindi dovresti interrogare lo stato dell'oggetto e confrontarlo con i tuoi valori. Qualche frammento di codice sarebbe utile per capire meglio il problema. –

risposta

17

Mentre un mock parziale non è una cattiva idea, è potrebbe trovare il tuo codice più facile da seguire se si utilizza un ArgumentCaptor invece di ottenere i valori dopo il fatto. È un matcher per argomenti speciali che tiene traccia del valore che corrisponde.

// initialized with MockitoAnnotations.initMocks(); 
@Captor ArgumentCaptor<Integer> offsetCaptor; 
@Captor ArgumentCaptor<float[]> floatsCaptor; 
@Mock Bar bar; 

@Test 
public void valuesShouldBeCloseEnough() { 
    Sut sut = new Sut(bar); 
    sut.doSomething(); 
    verify(bar).setFoo(offsetCaptor.capture(), floatsCaptor.capture()); 

    // check values with assertValuesAreCloseEnough, declared elsewhere 
    assertValuesAreCloseEnough(offsetCaptor.getValue(), floatsCaptor.getValue()); 
} 
+0

Questo fa esattamente quello di cui ho bisogno. Grazie! –

1

Si desidera un partial mock. Supponiamo che la classe che ha setFoo() si chiama Bar:

private static abstract class AssertingBar implements Bar { 

    @Override 
    void setFoo(int offset, float[] floats) { 
    this.offset = offset; 
    this.floats = floats 
    } 

    public void verify(float[] expectedFloats, float delta) { 
    // do your verification here 
    } 
} 

@Test 
public void valuesShouldBeCloseEnough() { 
    AssertingBar bar = Mockito.mock(AssertingBar.class, Mockito.CALLS_REAL_METHODS); 

    Sut sut = new Sut(bar); 
    sut.doSomething(); 

    bar.verify(...); 
} 

Se Bar è una classe, non un'interfaccia, quindi è possibile utilizzare doCallRealMethod()

+0

'Mockito.CALLS_REAL_METHODS' non sembra funzionare con un'interfaccia. Ho costantemente riscontrato errori nel provare a chiamare un metodo reale su un'interfaccia. Stavo facendo alcuni progressi con 'doCallRealMethod()', ma l'approccio captor argomento suggerito in un'altra risposta era più facile da lavorare, e richiedeva molto meno codice per questo caso particolare. Grazie comunque. –

Problemi correlati