Тестирование Spring-контроллера при сбое зависимостей - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующий класс контроллера:

@Controller
public class HelloController {

    private final HelloService service;

    public HelloController(HelloService service) {
        this.service = service;
    }

    @RequestMapping("/hello")
    public @ResponseBody String greeting() {
        return service.greet();
    }

}

Как видите, он принимает зависимость.Все это прекрасно работает на сервере.Однако при тестировании происходит сбой:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class WebLayerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldReturnDefaultMessage() throws Exception {
    this.mockMvc.perform(get("/hello")).andDo(print()).andExpect(status().isOk())
                .andExpect(content().string(containsString("Hello World")));
    }
}

Ниже приведен вывод файла журнала в target / surefire-reports /

-------------------------------------------------------------------------------
Test set: biz.martyn.footy.WebLayerTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.278 s <<< FAILURE! - in biz.martyn.footy.WebLayerTest
shouldReturnDefaultMessage(biz.martyn.footy.WebLayerTest)  Time elapsed: 0.005 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'helloController' defined in file [/home/martyn/eclipse-workspace/Footy/target/classes/biz/martyn/footy/controller/HelloController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'biz.martyn.footy.service.HelloService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'biz.martyn.footy.service.HelloService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Я понимаю, что @MockBean позволяет мнесоздать макет зависимости, но в тех случаях, когда я не хочу издеваться над ней?Здесь я рад, что реальный экземпляр зависимости используется как обычно.Или потому, что я только тестирую веб-слой, чтобы он не создавал экземпляр контроллера, как это было бы при запуске полного приложения?

ОБНОВЛЕНИЕ

Я также попробовал @Autowired внедрениеа не конструктор.Мое приложение работает, поэтому зависимость заносится в контроллер, но проверка не проходит.Ниже обновленный контроллер:

@Controller
public class HelloController {

    @Autowired
    private HelloService service;

    @RequestMapping("/hello")
    public @ResponseBody String greeting() {
        return service.greet();
    }

}

1 Ответ

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

@WebMvcTest отключит полную автоконфигурацию и вместо этого будет применять только конфигурацию, относящуюся к тестам MVC (т. Е. @Controller, @ControllerAdvice, @JsonComponent, Converter / GenericConverter, Filter, WebMvcConfigurer и HandlerMethodArgumentResolver bean-компоненты, но не @Component, @Service или @Repository bean-компоненты, поэтому вы должны использовать @MockBean для удовлетворения зависимости.

...