2013-02-04 13 views
6

używam Mockito mock klasy, która ma metodę, która wygląda mniej więcej tak:Sprawdzanie spójności wielu argumentów korzystających Mockito

setFoo(int offset, float[] floats) 

Chcę być w stanie zweryfikować, że wartości w tablicy (floats) są równe (w ramach danej tolerancji) wartościom z tablicy wartości oczekiwanych.

Połów jest to, że chcę sprawdzić zawartość floats począwszy od pozycji określonej przez offset. Dla celów testu nie wiem/nie obchodzi mnie, czym jest przesunięcie, o ile wskazuje na wartości, których się spodziewam. Nie obchodzi mnie też, co zawiera reszta tablicy. Dbam tylko o wartości zaczynające się od dostarczonego przesunięcia.

Jak to zrobić?

+0

Może to tylko ja, ale nie do końca rozumiem twoje pytanie. Na czym polega problem z pisaniem własnej metody, która przyjmuje offset i 2 tablice jako argumenty i sprawdza, czy elementy w tych tablicach począwszy od przesunięcia są równe? –

+0

@AndrewLogvinov jak mogę "napisać własną metodę" na obiekcie próbnym Mockito? –

+0

Nie sądzę, że powinieneś. Po wywołaniu 'setFoo()' oczekujesz, że stan obiektu się zmienił. Dlatego powinieneś zapytać o stan obiektu i porównać go z wartościami. Niektóre fragmenty kodu byłyby przydatne, aby lepiej zrozumieć problem. –

Odpowiedz

17

Podczas częściowym makiety nie jest zły pomysł, ty może łatwiej znaleźć twój kod, jeśli zamiast niego użyjesz ArgumentCaptor, aby uzyskać wartości po fakcie. Jest to specjalny argument matcher, który śledzi wartość, którą dopasowuje.

// 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

Dokładnie to, czego potrzebuję. Dzięki! –

1

Chcesz partial mock. Załóżmy, że klasa, która ma setFoo() nazwie 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(...); 
} 

Jeśli Bar jest klasą, a nie interfejsu, a następnie można użyć doCallRealMethod()

+0

'Mockito.CALLS_REAL_METHODS' nie działa z interfejsem. Ciągle dostaję błędy dotyczące próby wywołania prawdziwej metody w interfejsie. Poczyniłem pewne postępy z 'doCallRealMethod()', ale podejście sugerujące argumenty argumentów w innej odpowiedzi było łatwiejsze do uzyskania i wymagało dużo mniej kodu dla tego konkretnego przypadku. Dzięki i tak. –

Powiązane problemy