NoSuchBeanDefinitionException в тестовом классе @WebMvcTest - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы проверить конечную точку отдыха в BookRestController.Я пишу один тест с @WebMvcTest.

@RunWith(SpringRunner.class)
@WebMvcTest(BookRestController.class)
public class BookRestControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private CategoryService categoryService;

    private ObjectMapper objectMapper = new ObjectMapper();

    @Test
    public void should_create_new_category_when_try_to_update() throws Exception {

        given(categoryService.getCategoryById(20L)).willReturn(null);
        Category category = new Category("Fantastyka");

        ResultActions resultActions = mockMvc.perform(put("/api/category/10")
        .contentType(MediaType.APPLICATION_JSON)
        .content(objectMapper.writeValueAsString(category)));

        resultActions.andExpect(status().isNoContent());

    }
}

. В пакете репозитория у меня есть 4 репозитория, но в моей конечной точке тестирования я использую только один из них.enter image description here

И это мой метод из BookRestController

@RestController
public class BookRestController {

    @Autowired
    private CategoryService categoryService;

  @RequestMapping(value = "/api/category/{id}", method = RequestMethod.PUT)
    public ResponseEntity<Category> updateCategory(@PathVariable Long id, @RequestBody Category category){

        return ResponseEntity
                .status(HttpStatus.NO_CONTENT)
                .body(categoryService.updateCategory(id, category));
    }
}

Теперь, когда я запускаю тест, я получаю ошибку

Вызвано: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания бина с именем 'demoApplication': Неудовлетворенная зависимость, выраженная через параметр конструктора 0;вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа com.sda.spring.demo.repository.BookRepository: ожидается как минимум 1 компонент, который считается кандидатом на автопровод.Аннотации зависимостей: {}

Почему?Я не использую BookRepository в моем тесте.Как я могу это исправить?

Полный журнал:

java.lang.IllegalStateException: Не удалось загрузить ApplicationContext

в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:125) в org.springframework.test.context.support.DefaultTestContext.getApplicationContext (DefaultTestConte.LockTockTackThereTockToTecFoTecToFotToGTTTF )ToFDTF) .Default.0) в org.springframework.test.context.TestContextManager.prepareTestInstance (TestContextManager.java:246) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest (SpringJRuner4)..context.junit4.SpringJUnit4ClassRunner.methodBlock (SpringJUnit4ClassRunner.java:291) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild.(SpringJUnit4ClassRunner.java:97) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.unners.ParentRunner.runChildren (ParentRunner.java:288) по адресу org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) по адресу org.junit.runners.ParentRunner $ 2.оценке (ParentRunner.java:2pring или другом) или.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61) в org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks.java:70) в org.junit.runners.ParentRunner.run (ParentRunner.java:363f) для org.spr,intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47) в com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnittll.inteij.jtij.jtj)junit.вложенное исключениеis org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа com.sda.spring.demo.repository.BookRepository: ожидается как минимум 1 компонент, который квалифицируется как кандидат для автоматической передачи.Аннотации зависимостей: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray (ConstructorResolver.java:767) в org.springframework.beans.factory.support.ConstructorResolver.auverwstrug. Org. Org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor (AbstractAutowireCapableBeanFactory.java:1308) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance (AbstractAutowireCapableBeanFactory.java:1154) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:538) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:498) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 0 (AbstractBeanFactory.java: 320) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:318) в org.springframework.begetean199) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:846) в org.springframework.context.support.AbstractApplicationContext.jpg.Abstraboot.SpringApplication.run (SpringApplication.java:316) в org.springframework.boot.test.context.SpringBootContextLoader.loadContext (SpringBootContextLoader.java: 127) в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal (DefaultCacheAwareContextLoaderDelegate.java:99) в org.springframework.test.context.cache.DeflegeCateConware.OwareConteaderCacheбольше Вызывается: org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа com.sda.spring.demo.repository.BookRepository: ожидается как минимум 1 компонент, который считается кандидатом на автопровод.Аннотации зависимостей: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound (DefaultListableBeanFactory.java:1646) в org.springframework.beans.factory.Fory.LeGeFDFDFBspringframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.java:1166) в org.springframework.beans.factory.support.ConstructorResolver.resolveAresort.works.ConstructorResolver.createArgumentArray (ConstructorResolver.java:758) ... еще 43

Spring Boot: v2.1.0.RELEASE

РЕДАКТИРОВАТЬ: Работает.Я пропускаю @Autowire BookRepository в моем DemoApplication ... Я удалил этот код, и теперь он работает

@Autowired
    private ApplicationContext applicationContext;

    private BookRepository bookRepository;

    private CategoryRepository categoryRepository;

    @Autowired
    public DemoApplication(BookRepository bookRepository, CategoryRepository categoryRepository) {
        this.bookRepository = bookRepository;
        this.categoryRepository = categoryRepository;
    }

1 Ответ

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

ваш основной класс приложения будет загружать любой определенный компонент или функциональность, включаемую с помощью аннотаций.

например. @EnableSchedling, @ComponentScan, @Import и т. Д.

Все будет загружено в тесте среза.

См. Эту документацию для получения более подробной информации,

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-user-configuration

Если вы разумно структурируете свой код, ваш класс @SpringBootApplication будет использоваться по умолчанию в качестве конфигурации ваших тестов.

Тогда становится важным не засорять основной класс приложения настройками конфигурации, специфичными для конкретной области его функциональности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...