SpringBoot @MockBean и @WebMvcTest не работает - PullRequest
0 голосов
/ 27 ноября 2018

Controller.java

@RestController
public class Controller {

    @Autowired
    private UserService userService;

    @Autowired
    private BookService bookService;

    //Below userService implementation
    @PostMapping(value = "/addNewUser", consumes = "application/json")
    public void addNewUser(@RequestBody User newUser) {
        userService.addNewUser(newUser);
    }

    @GetMapping(value = "/findUserById/{id}", produces = "application/json")
    public User findUserById(@PathVariable("id") Long id) {
        return userService.findUserById(id);
    }

    @GetMapping(value = "/findUserByName/{name}", produces = "application/json")
    public User findUserByName(@PathVariable("name") String name) {
        return userService.findUserByName(name);
    }

UserServiceImpl.java

@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public void addNewUser(User newUser) {
        userRepository.save(newUser);
    }

Repository.java

public interface UserRepository extends CrudRepository<User, Long> {

    Optional<User> findUserByName(String name);

    Optional<User>  findUserBySurname(String surname);
}

ControllerTest.java

//@RunWith(SpringRunner.class)
@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

//    @MockBean
//    private UserService userService;
//
//    @MockBean
//    private BookService bookService;

    @Mock
    private UserService userService;

    @Mock
    private BookService bookService;

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test(){

    }
}

Выше конфигурация работает нормально, но ниже нет.

@RunWith(SpringRunner.class)
//@RunWith(MockitoJUnitRunner.class)
@WebMvcTest(Controller.class)
public class ControllerTest {

    @MockBean
    private UserService userService;

    @MockBean
    private BookService bookService;

//    @Mock
//    private UserService userService;
//
//    @Mock
//    private BookService bookService;

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test(){

    }
}

и я получаю эту ошибку

Приложение не удалось запустить


Описание:

Для компонента требуется компонент с именем entityManagerFactory, который не может быть найден.

Действие:

Рассмотрите возможность определения компонента с именем entityManagerFactory в своей конфигурации.

2018-11-26 21: 58: 32.343 ОШИБКА 7385 --- [main] ostest.context.TestContextManager: возникла исключительная ситуация при разрешении TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@5c7bfdc1] для подготовки тестаinstance [com.webservices.example.librarydatabaseservice.controller.ControllerTest@74f827ad]

java.lang.IllegalStateException: не удалось загрузить ApplicationContext в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:125) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.test.context.support.DefaultTestContext.xtAj () ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields (MockitoTestExecutionListener.java:99) ~ [spring-boot-test-2.1.0.RELEASE.jar: 2.1.0.RELEASE] at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields (MockitoTestExecutionListener.java:79) ~ [spring-boot-test-2.1.0.RELEASE.jar: 2.1.0.RELEASE] at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance (MockitoTestExecutionListener.java:54) ~ [spring-boot-test-2.1.0.RELEASE.jar:2.1.0.RELEASE] в org.springframework.test.context.TestContextManager.prepareTestInstance (TestContextManager.java:246) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest (SpringJUnit4ClassRunner.java:227) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.jJun.prin4$ 1.runReflectiveCall (SpringJUnit4ClassRunner.java:289) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) ~ [junit-4.12.jar: 4.12] в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock (SpringJUnit4ClassRunner.java:291) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:246) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.spring.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:97) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.junit.runners.ParentRunner $ 3.run (ParentRunner.j:290) ~ [junit-4.12.jar: 4.12] на org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) ~ [junit-4.12.jar: 4.12] в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) ~ [junit-4.12.jar: 4.12]в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) ~ [junit-4.12.jar: 4.12] в org.junit.runners.ParentRunner $ 2.оценке (ParentRunner.java:268) ~ [junit-4.12.jar: 4.12] at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] вorg.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:70) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.junit.runners.Parent.run (ParentRunner.java:363)~ [junit-4.12.jar: 4.12] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:190) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at org.junit.runner.JUnitCore.run (JUnitCore.java:137) ~ [junit-4.12.jar: 4.12] в com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdejTunRun: 68).jar: na] at com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47) ~ [junit-rt.jar: na] в com.intellij.rt.execution.junit.JUnitS.prepareStreamsAndStart (JUnitStarter.java:242) ~ [junit-rt.jar: na] в com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70) ~ [junit-rt.jar: na]Вызвано: org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'bookRepository': невозможно создать внутренний бин '(внутренний бин) # 3f362135' типа [org.springframework.orm.jpa.SharedEntityManagerCreator] при установке бинасвойство entityManager;вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем '(внутренний бин) # 3f362135': невозможно разрешить ссылку на бин entityManagerFactory при установке аргумента конструктора;вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет объекта bean с именем entityManagerFactory, доступного в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean..RELEASE.jar: 5.1.2.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNeeded (BeanDefinitionValueResolver.java:131) ~ [spring-beans-5.1.2j.RELERELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1648) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1400) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в орг.,java: 575) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory ~)-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFactory.java:320) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE]в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstananFisoryBable (DefaultSigntableStable)ctory.java:827) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:863) ~ [spring-context-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:546) ~ [spring-context-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775) ~ [spring-boot-2.1.0.RELEASE.jar: 2.1.0.RELEASE] в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397)~ [spring-boot-2.1.0.RELEASE.jar: 2.1.0.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication.java:316) ~ [spring-boot-2.1.0.RELEASE.jar: 2.1.0.RELEASE] at org.springframework.boot.test.context.SpringBootContextLoader.loadContext (SpringBootContextLoader.java:127) ~ [spring-boot-test-2.1.0.RELEASE.jar: 2.1.0.RELEASE]в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal (DefaultCacheAwareContextLoaderDelegate.java:99) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.ste.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:117) ~ [spring-test-5.1.2.RELEASE.jar: 5.1.2.RELEASE] ... 25 опущенных общих фреймов Причина: org.springframework.beans.fact.BeanCreationException: Ошибка создания компонента с именем '(внутренний компонент) # 3f362135': Невозможно разрешить ссылку на компонент 'entityManagerFactory' при установке аргумента конструктора;Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет объекта bean с именем entityManagerFactory, доступного в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReferenceVanueResolveReference (beanDefin.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNeeded (BeanDefinitionValueResolver.java:110) ~ [spring-beans-5.1.2j.RELERELEASE] в org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments (ConstructorResolver.java:660) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.java:478) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.suppan.java: 1288) ~ [весна-bean-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:112EL -j.arr.: 5.1.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:538) ~ [spring-beans-5.1.2.RELEASE.REL] на уровне 5.1:.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:498) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.ssuBeanDefinitionValueResolver.resolveInnerBean (BeanDefinitionValueResolver.java:312) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] ... 43 опущенных общих фрейма Вызвано: org.springframework.beans.factitionExanSe::На org.springframework.beans.factory.support.DefaultListableBeanFactor недоступен бин с именем entityManagerFactory.y.getBeanDefinition (DefaultListableBeanFactory.java:772) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanJefF () ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:294) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:367) ~ [spring-beans-5.1.2.RELEASE.jar: 5.1.2.RELEASE] ... 51 общие кадрыопущено

В нем говорится, что есть проблема с entityFactoryManager, но в одном фиктивном способе это работает, а в другом нет ...

Полный код Github repo

Iиспользую SpringBoot в версии: 2.1.0.RELEASE

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Ваш тест загружает JPA бином entityManagerFactory.В вашем основном классе приложений, я думаю, вы написали @EnableJpaRepositories, что не нужно, если у вас есть хранилище в базовом пакете основного приложения.Удалите эту аннотацию, поскольку ваш тестовый класс должен предназначаться только для тестирования веб-слоя.

0 голосов
/ 27 ноября 2018

Попробуйте добавить в проект класс конфигурации следующим образом:

@Configuration
@EnableJpaRepositories(basePackages = "com.webservices.example.librarydatabaseservice.repository")
public class RepositoryConfiguration {
}

Проблема не имеет никакого отношения к вашему тесту.Это проблема Spring, запускающая и загружающая сервисы.В тестовой версии Mockito вам не требуется, чтобы он загружал все классы и издевался над сервисом / репозиторием, чтобы скрыть проблему.В другой версии теста SpringRunner должен загрузить ваш applicationContext, который не работает из-за отсутствующей конфигурации JPA.

...