testowanie - przekaz jako parametr getThings zawierajacy pewien element

0

Musze przetestowac metode, ktora jako parametr bierze inny obiekt i on ma metode getThings i tam ta metoda petli po tych thingach i wchodzi w jedno z rozgalezien dla danej nazwy tego thinga. Jak zamockowac taki obiekt o danym thingu, jako parametr to metody? To jest moja proba, ale w then return chyba powinien byc Optional.of(wywolanie konstruktora) czy cos takiego
when(obj.getThings().stream().anyMatch(p->p.getName()=="DANA NAZWA")).thenReturn(Optional.of(obj));

0

btw getThings zwraca liste thingow, a thingi to dto, obiekty typu entity wiec nie da sie normalnie skonstruowac tego obiektu

2

I THING that you should show some code or learn jezyk polska

1

Nic nie zrozumiałem z tego opisu, ale podpowiem: nie mockować!

1

Zbyt chaotycznie.
Dodaj kod metody.

Po co chcesz to mockować.
Biblioteka do mockowania ma już swoje testy :)

1

A czemu po prostu nie stworzysz tego obiektu i nie przekażesz do testu? Jak miałabyś metodę która oczekuje stringa to też go mockujesz i ustawiasz zeby np. jakieś length zwracało odpowiednią wartość? Czy moze po prostu używasz Stringa?

Swoją drogą i on ma metode getThings i tam ta metoda petli po tych thingach to bardzo zły design i gwałt na enkapsulacji i w ogóle dramat. To twój obiekt powinien mieć metodę getMatchingThing(String cośtam), a nie że wyciągasz w jakimś innym miejscu jego bebechy i w nich mieszasz. Programowanie obiektowe, mówi ci to coś? o_O

edit: a to co napisałaś wyżej z tym mockiem to też dramat, bo widać ze nie rozumiesz jak to mockowanie w ogóle działa. Trzezba by cały ten łańcuszek zbudować jedno oczko po drugim, tzn ustawić expect na getThings który zwróciłby ci mocka listy, potem na nim ustawić że stream zwróci mocka strumienia itd. Generalnie szaleństwo.

0

tak to mniej wiecej wyglada

    public costam method(Object1 obj) {
            for (Thing thing: obj.getThings) {
                if ("WARUNEK".equals(thing.getName())) return costam;
            }             
    }

Wiec moje pytanie jak przetestowac ta metode przez przekazanie obiektu w ktorym jeden z elementow thing posiada name:"WARUNEK"

Oczywiscie w realu jest dluzsza i bardziej skomplikowana, np to rozgalezieni nic nie zwraca tylko modyfikuje w pewien sposob rezultat

1
public class Object1 {

  List<Thing> things;

  public Object1(List<Thing> things) {
    this.things = things;
  }

  public List<Thing> getThing() {
    return things;
  }
}
...

new Object1(List.of(new Thing(name: "WARUNEK")))

odpowiedz: nie mockować ?

Oczywiscie w realu jest dluzsza i bardziej skomplikowana, np to rozgalezieni nic nie zwraca tylko modyfikuje, jak modyfikuje to sprawdzasz np czy Thing'i nie zostały zmodyfikowane

myślę że problem polega na tym że próbujesz coś zmockować czego nie musisz/potrzebujesz zmockować, dlatego masz problem którego nie jesteś w stanie opisać

2

Podpowiedź kolejna: nie testować metod ani klas. Zastanów się co to ma robić( w sensie : do czego potrzebujesz). I sprawdź testem czy to robi.

1

Jw. nie musisz pisać testu per klasa. Najpierw zadaj sobie pytanie, jakie zachowanie/historyjkę testujesz. Nie testuj implementacji. Potem jeśli chodzi o kod, to w teście jednostkowym podnieś cały moduł/komponent bez żadnych mocków. Testuj na realnych obiektach, na produkcji nie ma mocków.

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