Jeśli chcesz nadać wartości zmiennym albo zainicjalizować klasę, powinno się to odbywać w metodach z adnotacjami @Before i @BeforeClass, a w JUnit 5 @BeforeEach i @BeforeAll. Taki układ zapewni Ci identyczny stan początkowy każdego testu i zapobiegnie dziwnym błędom.
Jeśli masz coś do „posprzątania” po teście, użyj metody z adnotacją @After / @AfterEach. Jeśli sprzątanie dotyczy całej klasy testowej, należy użyć @AfterClass / @AfterAll.
Sprzątanie jest szczególnie ważne w testach integracyjnych. Kiedyś boleśnie się o tym przekonałam. Pewnego dnia podczas uruchamiania testów lokalnie, zaczęłam dostawać dziwne błędy. Jeden test dotyczący kodu zniżkowego w koszyku zakupowym przestał przechodzić i pokazywał niespodziewane wyniki. Z każdym uruchomieniem było coraz gorzej, bo oczekiwana cena produktu w koszyku coraz bardziej różniła się od tej prawdziwej. Zrobiłam najlepszą rzecz, którą można zrobić w tej sytuacji, czyli poszłam na kawę :)
Kiedy wróciłam, zauważyłam coś, co wcześniej nie było oczywiste. Test sprzątał sam po sobie. Nie było metody z adnotacją @AfterEach, tylko na samym końcu testu po asercjach kod zniżkowy był usuwany z koszyka. Wszystko stało się jasne, kiedy asercja w teście się nie zgadzała, dalsze polecenia nie były wykonywane. W ten sposób z każdym uruchomieniem testu do mojego koszyka trafiały kolejne kody zniżkowe, coraz bardziej obniżając cenę. Kiedy wydzieliłam kod sprzątający do właściwych metod, wszystko wróciło do normy.
Są dwa morały z tej historii. Po pierwsze, należy używać metod pomocniczych, żeby ustawiać i usuwać kontekst, w którym działają testy. Po drugie, jeśli masz dziwne błędy i zakopujesz się w nich, zrób sobie przerwę i pomyśl o czymś innym. Twój mózg w międzyczasie odnajdzie rozwiązanie :)