Cześć,
w tym wpisie chciałbym przedstawić rozwiązanie błędów przedstawionych w tytule. Jest to wpis wskazujące rozwiązanie problemu, na jaki natknąłem się podczas programowania testów jednostkowych. Chciałbym dokumentować ich więcej dla siebie i dla potomnych.
Moim zadaniem było przetestowanie kontrolera restowego, który miał łączyć się z bazą danych i pobierać z niej pewne informacje. Kontroler zawierał adnotacje @RestController, @RequestMapping oraz @Api
Na start dostałem projekt bez większych wskazówek, przez co trochę czasu zajęło mi połapanie jak zainicjować w ogóle potrzebne fragmenty aplikacji. Dostałem starszą wersję springa, przez co trochę więcej było z tym zabawy.
Żeby móc to wszystko przetestować musiałem zdefiniować klasę testową i podpiąć do niej wszystkie potrzebne konfiguracje zawierające beany (te używające pliki np. applicationContext.xml).
Dodam jeszcze, że projekt jest pod kontrolą mavena.
W celu testowania spring do pom.xml musiałem dodać
W miejsce ${spring.version} wstawiacie aktualną wersję springa używaną w projekcie.
A w celu poprawnego testowania, musiałem zaktualizować używaną bibliotekę z wersji 2.5.0 na 3.0.1
Moja klasa, po walce z inicjacją testu, wygląda mniej więcej tak
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import java.util.Collections;
import java.util.List;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@ContextConfiguration(classes = {/* Tu obowiązkowo klasy, które mają @Configuration i te co importują dane z .xml posiadający beany oraz dane konfiguracyjne np. SwaggerConfig.class Jeżeli masz tylko applicationContext.xml, to nic tu nie musisz podawać*/})
@RunWith(SpringJUnit4ClassRunner.class) //Oznacz jako springowy junit test
@WebAppConfiguration //Ta linijka rozwiązuje problem "No qualifying bean of type [javax.servlet.ServletContext]"
public class SearchServiceTest {
private MockMvc mockMvc; //To pozwala na testowanie kontrolera restowego
@Autowired
private MyDAO myDAO ;//Jakies metody odwolujace sie do bazy danych
@Autowired
private SearchService searchService;//Moj restowy kontroler
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(searchService).build();
}
@Test
public void test() throws Exception {
List<Data> data = myDAO .getData("args");
ResultActions perform = mockMvc.perform(get("/search/data/args"));//wywołaj endpoint
JSONObject jsonObject = new JSONObject();
jsonObject.put("list", tag);
Object asyncResult = perform.andReturn().getResponse().getContentAsString();//zwróć jakiś wynik
System.out.println("result 1: " + asyncResult + ", result 2: " + jsonObject.getString("list")); //Porównaj sobie w konsoli co wyszło
}
}
Oczywiście kod został zmodyfikowany na potrzeby tego wpisu oraz ten test nie jest kompletny. Ale sama idea przetestowania tego kontrolera została tutaj ujęta.
Warto też wspomnieć, że jeżeli coś nie działa oraz twój applicationContext.xml nie jest w folderze resources, to spróbuj go tam przerzucić, a możliwe, że rozwiążesz swój problem.