Mockito - tworzenie obiektu

0

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

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

A w aktualnej metodzie:

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ć?

0

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

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.

0

Chyba tylko za pomocą PowerMocka.

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

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

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

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.

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1