Testy metody która importuje zmienne z statycznej klasy

0

Witam, moja funkcja do której chce napisać test importuje Map<String, Object> z Managera który jest singletonem, czyli na początku pobiera mapę Manager.getInstance.getCache(), następnie wykonuje pewne operacje i usuwa z niej kilka pozycji na podstawie daty date.

Więc potrzebował bym podczas testu włożyć do tej mapy 2 itemy które są aktualne i 2 które są przestarzałe, a następne wywołać funkcję clearCache i sprawdzić na końcu czy moja Mapa ma w sobie 2 itemy.

Pomożecie ?

0

Wstaw elementy do mapy? Gdzie jest problem. Tak czy owak singleton to jest pattern, którego się nie używa. Zrefaktoruj swój kod, bo pisanie jakichkolwiek testów dla kodu z singletonami to sztuka dla sztuki

0

To bardzo duży projekt przejęty po innej firmie do starych urządzeń. A elementy wstawiłem tylko nie potrafię zmusić drugiej klasy by korzystała z tej tablicy którą zamockowałem

0

Tablicy czy mapy? Problem pewnie jest tam gdzie nie wiesz jak zapytać

0

Mapy

0

To rak rozwiazanie ale moze cos pokroju PowerMock ewentualnie wkopanie sie tam refleksja?

0

Najlepiej jakby ta metoda dostawała po prostu mapę. Jeśli się tak łatwo nie da, to zrób sobie pomocnicza metodę i do niej napisz testy.

Samego statica mozesz wyrzucic na zewnatrz i tez przyjąć go jako zależność, np. CacheProvider. Wtedy mozesz tez taki komponent zamockowac itd. Jest sporo technik.

2

Singleton ma tę przewagę nad klasą statyczną że DA się testować. Wystarczy zmienić wywołanie Manager.getInstance() na lokalną zmienną i zrobić dependency injection w konstruktorze (nie trzeba do tego używać kontenerów), potem żeby nie ruszać reszty kodu wystarczy zrobić konstruktor domyślny który użyje getInstance() i przekaże do drugiego

    public Foo() { // tego konstruktora używa aplikacja
        this(Manager.getInstance());
    }

    public Foo(Manager manager) { // tego konstruktora możesz użyć w testach i zamockować klasę Manager
        this.manager = manager;
    }

tam gdzie masz Manager.getInstance.getCache() zmieniasz na this.manager.getCache() i pora na csa

0

Jeśli Twoja funkcja nazywa się myFunction(), to w teście mógłbyś zrobić coś w ten deseń

@Test
public void testMyFunction() {
    // Tworzenie testowego Managera z osobną instancją Mapy
    Manager testManager = new Manager();
    Map<String, Object> testCache = new HashMap<>();
    testCache.put("key1", "value1"); // aktualny item
    testCache.put("key2", "value2"); // aktualny item
    testCache.put("key3", "value3"); // przestarzały item
    testCache.put("key4", "value4"); // przestarzały item
    testManager.setCache(testCache);

    // Wywołanie testowanej funkcji
    myFunction();

    // Sprawdzenie, czy mapa zawiera tylko 2 aktualne itemy
    Map<String, Object> resultCache = testManager.getCache();
    assertEquals(2, resultCache.size());
    assertTrue(resultCache.containsKey("key1"));
    assertTrue(resultCache.containsKey("key2"));
}
0
Rozumek29 napisał(a):

To bardzo duży projekt przejęty po innej firmie do starych urządzeń. A elementy wstawiłem tylko nie potrafię zmusić drugiej klasy by korzystała z tej tablicy którą zamockowałem

A po co w ogóle mockujesz?

0

Zbyt nisko próbujesz to testować - zrób krok wstecz, zastanów się co faktycznie próbujesz testować (i.e. czemu wsadzać te wartości do tej mapy) i napisz test z tej perspektywy.

Poza tym, singletony i zmienne statyczne to jest wręcz kanon nietestowalnego kodu, więc możliwe że już na starcie jesteś spalony.

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