Cześć,
Chciałem wejść w temat testów ogólnie w Springu, a szczególnie w temat Mockito.
Aby przejść do testowania należy mieć określony plik .xml z contextem aplikacji. W mojej strukturze mam plik* /WEB-INF/dispatcher-servlet.xml*, który zawiera same informacje i beany konfiguracyjne, np. handlerMapping, entityManagerFactory itd. Mam też plik resources/spring/application-config.xml, który został mi automatycznie dorzucony przez STS i nie zawiera w sumie nic, poza suchą definicją XMLa samego w sobie. Korzystając z wątku: http://stackoverflow.com/questions/16458754/spring-web-mvc-dispatcher-servlet-xml-vs-applicationcontext-xml-plus-shared dowiedziałem się, że taki właśnie podział na oba pliki powinien może istnieć. Wiadomo, to tylko nazwy, ale chodzi bardziej o logiczne rozdzielenie zawartości obu plików.
Przechodząc do właściwego pytania - moja klasa testująca:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/application-config.xml")
public class GetBookTest {
@Autowired
private BookService bookService;
@Test
public void getSingleBookShouldReturnBook() {
Object result = bookService.findById(1);
...
Pierwszym problemem przy najprostszym wywołaniu service jest NullPointer na linijce: Object result = bookService.findById(1);
chociaz obiekt o takim id istnieje, zresztą próbowałem na różnych. Czy może być to związane z niepoprawnym określeniem kontekstu? Nie ma tam żadnych beanów, bo nie miałem potrzeby tworzenia takowych w application-context.xml. Też ciężko jest wskazać na lokalizację dispatcher-servlet.xml, której nijak nie chce Spring załapać. W takim układzie czy przenieść gdzieś indziej dispatcher-servlet,xml, czy zmodyfikować w jakiś sposób application-context.xml?
Aha i zapomniałem o jednym fakcie: NullPointer dostaję bez @Autowired, po dodaniu ten adnotacji krzyczy:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'biblioteka.GetBookTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private pl.test.library.service.BookService biblioteka.GetBookTest.bookService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.test.library.service.BookService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Po dodaniu do application-context.xml jedynej deklaracji, która tam teraz się znajduje:
<context:component-scan base-package="pl.test.library"/>
Dostaję komunikat Failed to load ApplicationContext.