Весеннее тестирование Неудовлетворенная зависимость NoSuchBeanDefinitionException - PullRequest
0 голосов
/ 14 марта 2020

Когда я пытаюсь запустить свои тесты, все они терпят неудачу, потому что они не могут найти компонент одного из моих классов.

Вот мои коды, которые используются в контексте:

Исключение, которое я получаю, это:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testProtoAdminController' : Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'TestProtoCopyService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

TestProtoAdminControllerTest

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = TestProtoAdminController.class)
public class TestProtoAdminControllerTest {

//Some used services

 @Before
public void setUp() {
    authenticatedMockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

@Test
@WithMockUser
public void testCopyProto() throws Exception {
    authenticatedMockMvc.perform(post("/api/admin/{id}/copy", 1)
            .contentType(MediaType.APPLICATION_JSON)
            .content(asJson(new TestProtoBaseVo()))).andExpect(status().isOk());
}

//Some more tests which are not important in this case

TestProtoCopyService

@Service
public class TestProtoCopyServiceImpl implements TestProtoCopyService {

    //Other services and repositories I have to use.
    //Methods

}

TestProtoCopyService

public interface TestProtoCopyService {
    @Transactional
    void copyTestProto(long testProtoId, String sourceTenant, String targetTenant);
}

TestProtoAdminController

@RestController
@RequestMapping("/*")
public class TestProtoAdminController {
private TestProtoCopyService testProtoCopyService;

public TestProtoAdminController(TestProtoCopyService testProtoCopyService {
    this.testProtoCopyService = testProtoCopyService;
}

1 Ответ

0 голосов
/ 14 марта 2020

При использовании @WebMvcTest Spring подготовит все для тестирования вашего веб-слоя. Это не означает, что все ваши bean-компоненты сканируются и являются частью этого тестового прикладного контекста и готовы к внедрению.

В общем, вы обычно высмеиваете класс обслуживания вашего контроллера с помощью @MockBean, а затем используете Mockito для укажите его поведение:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = TestProtoAdminController.class)
public class TestProtoAdminControllerTest {

  @MockBean
  private TestProtoCopyService mockedService

  // the rest

  @Before
  public void setUp() {
    authenticatedMockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
  }

  @Test
  @WithMockUser
  public void testCopyProto() throws Exception {

    authenticatedMockMvc.perform(post("/api/admin/{id}/copy", 1)
            .contentType(MediaType.APPLICATION_JSON)
            .content(asJson(new TestProtoBaseVo()))).andExpect(status().isOk());
  }

Если вы хотите, чтобы Spring Boot bootstrap весь контекст приложения для каждого компонента, рассмотрите использование @SpringBootTest. С помощью этой аннотации вы можете внедрить любой компонент в свое приложение. Недостатком здесь является то, что вам нужно предоставить всю инфраструктуру (базу данных / очереди / и т. Д. c.) Для вашего теста.

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