Mockito - tworzenie obiektu

Mockito - tworzenie obiektu
shagrin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Norwegia, Stavanger
0

Hej,
Mam problem z mockowaniem obiektu, który jest tworzony w metodzie wywoływanej z serwisu.
W teście mam takie coś:

Kopiuj
@Mock
private SomeClass _object;
//...
Mockito.when(_object.getId()).thenReturn(1L);

A w aktualnej metodzie:

Kopiuj
private Blah someMethod(){
    SomeClass obj = new SomeClass();
    //.. do stuff with this object and eventually set its Id

    if (needToDoSomething(obj.getId())){
    ...
    }
}

Niestety, we fragmencie if (needToDoSomething(obj.getId())) nie jest zwracane 1L jak bym chciała, ma ktoś pomysł jak to zmockować?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Tworzysz przecież w metodzie zupełnie nową instancję obiektu, która już nie jest mockowana.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Na temat odpowiadaj w postach.

Zasadniczo, nie powinnaś - w testach jednostkowych z założenia mockuje się zależności, podczas gdy u Ciebie tworzenie instancji SomeClass jest częścią algorytmu (implementacji), nie zależnością.

Jeśli jednak nie chcesz przepisywać tego kodu, poczytaj sobie o możliwych rozwiązaniach np. tutaj: https://stackoverflow.com/questions/5920153/test-class-with-a-new-call-in-it-with-mockito

Edit: ewentualnie zmockuj needToDoSomething.

XL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

Chyba tylko za pomocą PowerMocka.

Kopiuj
PowerMockito.whenNew(SomeClass.class).thenReturn(_object);

Dodatkowo klasę gdzie jest someMethod trzeba mieć w @PrepareForTest.

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
5

Czy na pewno potrzebujesz Mockowac SomeClass?
Jeśli tak to kod jest do bani, bo jest nietestowalny.

Użyj dependency injection. (Przy okazji: nie potrzebujesz do tego springa/javaee. guice ani niczego). Przekaż po prostu do konstruktora tej klasy, gdzie jest metoda someMethod, obiekt typu SomeClass albo Supplier<SomeClass>,

Kopiuj
class DzikaKlasa {
... 
private final Supplier<SomeClass> someClassProvider;

DzikaKlasa ( final Supplier<SomeClass> someClassProvider ) {
     this.someClassProvider = someClassProvider;
}


private Blah someMethod(){
    SomeClass obj = someClassProvider.get();
    //.. do stuff with this object and eventually set its Id

    if (needToDoSomething(obj.getId())){
    ...
    }
}

Nie używaj PowerMocka - jeśli kod jest twój. Popraw kod.
PowerMock służy do testowania starych/ popsutych projektów, gdzie nie możesz ingerować w kod.

DI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 103
0

Ewentualnie możesz wydzielić tworzenie instancji tego obiektu do jakiejś metody i tę metodę zamockować. Ale oczywiście to słabe rozwiązane.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.