У меня есть следующий класс контроллера:
@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();
}
}