2017-02-26 5 views
0

Ich bin mit Spring Data JPA mit Frühlings-Boot und hat einen Mock MVC-Test der in den folgenden stacktrace Ergebnisse:Frühlings-Boot-Daten JPA nicht autowire Repository-Schnittstelle in MockMVC Test

Parameter 1 of constructor in xyz.jacobclark.controllers.HomeController required a bean of type 'xyz.jacobclark.repositories.PageRepository' that could not be found. 


Action: 

Consider defining a bean of type 'xyz.jacobclark.repositories.PageRepository' in your configuration. 

2017-02-26 18:29:11.350 ERROR 65426 --- [   main] o.s.test.context.TestContextManager  : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.a[email protected]7219ec67] to prepare test instance [[email protected]] 

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) ~[spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:47) ~[spring-boot-test-autoconfigure-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) ~[spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12] 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12] 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12] 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12] 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12] 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12] 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) [spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) [junit-4.12.jar:4.12] 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) [junit-rt.jar:na] 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) [junit-rt.jar:na] 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) [junit-rt.jar:na] 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) [junit-rt.jar:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0] 
    at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0] 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) [idea_rt.jar:na] 
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'homeController' defined in file [/Users/jacobclark/workspace/jacobclark.xyz/build/classes/main/xyz/jacobclark/controllers/HomeController.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'xyz.jacobclark.repositories.PageRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) ~[spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) ~[spring-boot-test-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) ~[spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) ~[spring-test-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    ... 28 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'xyz.jacobclark.repositories.PageRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 

Hier ist das eigentliche Repository:

package xyz.jacobclark.repositories; 

import org.springframework.data.repository.CrudRepository; 
import org.springframework.stereotype.Repository; 
import xyz.jacobclark.models.entities.Page; 

import java.util.List; 

@Repository 
public interface PageRepository extends CrudRepository<Page, String> { 
    List<Page> findById(String id); 

    List<Page> findByTitle(String titlex); 
} 

Während die Steuerung wie folgt aussieht:

package xyz.jacobclark.controllers; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import xyz.jacobclark.adapters.GitHubAdapter; 
import xyz.jacobclark.repositories.PageRepository; 

import java.util.Map; 
import java.util.concurrent.ExecutionException; 

@Controller 
public class HomeController { 
    PageRepository pageRepository; 
    private GitHubAdapter gitHubAdapter; 

    @Autowired 
    HomeController(GitHubAdapter gitHubAdapter, PageRepository pageRepository) { 
     this.gitHubAdapter = gitHubAdapter; 
     this.pageRepository = pageRepository; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Map<String, Object> model) throws ExecutionException { 
     model.put("githubRepoCount", gitHubAdapter.getGitHubRepositoriesCount()); 
     return "home"; 
    } 
} 

Und schließlich, die andernfalls Test:

package xyz.jacobclark.controllers; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 
import org.springframework.boot.test.mock.mockito.MockBean; 
import org.springframework.test.context.junit4.SpringRunner; 
import org.springframework.test.web.servlet.MockMvc; 
import xyz.jacobclark.adapters.GitHubAdapter; 

import static org.mockito.Mockito.when; 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 

@RunWith(SpringRunner.class) 
@WebMvcTest(HomeController.class) 
public class HomeControllerTest { 

    @Autowired 
    private MockMvc mvc; 

    @MockBean 
    private GitHubAdapter gitHubAdapter; 

    @Test 
    public void getOneRandomly() throws Exception { 
     when(gitHubAdapter.getGitHubRepositoriesCount()).thenReturn("42"); 

     mvc.perform(get("/")) 
       .andExpect(status().isOk()) 
       .andExpect(view().name("home")) 
       .andExpect(model().attribute("githubRepoCount", "42")); 
    } 
} 

Antwort

0

Der Fehler sagt: No qualifying bean of type 'xyz.jacobclark.repositories.PageRepository'

Sie haben GitHubAdapter Mocked aber keine Konfiguration bereitgestellt PageRepository zu instanziiert.

würde ich 3 Möglichkeiten vorschlagen:

  1. Mock PageRepository
  2. eine @ContextConfiguration bieten die Bohne zu instanziiert
  3. Mark das Repository als nicht erforderlich, wenn null ist ok: @Autowired(required = false)
+0

Kann Spring das reale Repository nicht abrufen? Warum muss es verspottet werden? –

+0

Wenn Sie das reale Repository abrufen möchten, müssen Sie einen Testkontext und eine eingebettete Datenbank wie H2 bereitstellen. Siehe hier: http://stackoverflow.com/questions/35707469/how-can-i-mock-db-connection-in-spring-boot-for-testing-purpose/35708807 – DairyLea

+0

so kann ich es nicht ohne zu laufen zusätzliche Konfiguration, aka bekommen es gegen die echte Sache laufen? –

0

Ihr Repository.

@Repository 
public interface PageRepository extends CrudRepository<Page, String> { 
    List<Page> findById(String id); 

    List<Page> findByTitle(String titlex); 
} 

Diese @Repository (Anmerkung) löschen und Ihre Werkzeuge (Implementation) bewegen. Dao (Schnittstelle) -> diese Anmerkung verwenden DaoImpl Klasse (implementiert).

Probe EntityManagerFactory

<jpa:repositories base-package="xyz.jacobclark.repositories"></jpa:repositories> 

Musterdatenspeicher

Don`t verwenden Annotation (@Repository). Sie verwenden das Basispaket in den Einstellungen config.

public interface AccountRepository extends PagingAndSortingRepository<Account, Integer>{ 

    public Account findById(String id); 

    public List<Account> findByCompany(Company company); 
} 

Ihr Controller

@Controller 
public class HomeController { 
    PageRepository pageRepository; 
    private GitHubAdapter gitHubAdapter; 

    @Autowired 
    HomeController(GitHubAdapter gitHubAdapter, PageRepository pageRepository) { 
     this.gitHubAdapter = gitHubAdapter; 
     this.pageRepository = pageRepository; 
    } 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Map<String, Object> model) throws ExecutionException { 
     model.put("githubRepoCount", gitHubAdapter.getGitHubRepositoriesCount()); 
     return "home"; 
    } 
} 

Beispiel Controller

Sie verwenden Service und dao in der Steuerung. Controller ist Tor. so ist die Implementierung nur Bean. und ich denke, du musst DI und IOC suchen. Ich empfehle dir, deinen Mocktest nicht zu benutzen. Sie verwenden einen Junit-Test. und Sie rufen Einheit (Service und Dao). diese Verbindung: this Spring Tutorial und this jUnit + Spring Tutorial XD.

@RequestMapping(value = "/association") 
@Controller 
public class AssociationController { 

    @Autowired 
    private AssociationService associationService; 

    @Autowired 
    private AccountService accountService; 

    @Autowired 
    private CompanyService companyService; 

    @Autowired 
    private ProductService productService; 

    @RequestMapping(value = "/settings/company") 
    public ModelAndView showCompany(ModelAndView mav, HttpServletRequest req, Authentication auth) { 
     CustomUserDetail customUserDetail = (CustomUserDetail) auth.getPrincipal(); 

     int associationIdx = customUserDetail.getAccount().getAssociation().getIdx(); 

     Association association = associationService.findAssociationByIdx(associationIdx); 

     mav.addObject("association", association); 
     mav.setViewName("/association/association_settings_company"); 

     return mav; 
    } 

    .... 

} 
Verwandte Themen