junit Spring Boot @RestController测试代码错误

6kkfgxo0  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(181)

我在 Spring Boot 上为@RestController创建了一个测试代码,然后发生了此错误。

  1. java.lang.IllegalStateException: Failed to load ApplicationContext
  2. at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
  3. ---------------------------------------------------------------------------
  4. Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberController' defined in file [C:\dev\react\Kculter\target\classes\com\prac\react\controller\MemberController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.prac.react.service.MemberService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
  5. --------------------------------------------------------------------------------------------------
  6. Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.prac.react.service.MemberService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

即使我向MemberService类添加了@Service注解并向MemberController类添加了@RestController注解,我也发现了此问题。如何解决此问题?
我将在下面显示我的测试代码、MemberController和MemberService代码
MemberControllerTest.java

  1. package com.prac.react.controller;
  2. import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
  3. import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
  4. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
  5. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
  6. import org.junit.jupiter.api.DisplayName;
  7. import org.junit.jupiter.api.Test;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
  12. import org.springframework.http.MediaType;
  13. import org.springframework.test.web.servlet.MockMvc;
  14. import com.fasterxml.jackson.databind.ObjectMapper;
  15. import com.prac.react.model.dto.Member;
  16. import com.prac.react.service.MemberServiceTest;
  17. @WebMvcTest(MemberController.class)
  18. public class MemberControllerTest {
  19. @Autowired
  20. MockMvc mvc; // 가상의 http request를 테스트 할때 만들기 위해서 사용하는 인스턴스
  21. @Autowired
  22. ObjectMapper obm;
  23. Logger logger = LoggerFactory.getLogger(MemberServiceTest.class);
  24. @Test
  25. @DisplayName("로그인 테스트 1 ") // 회원이 존재할때를 가장했을때를 위한 테스트 코드
  26. void testSignInMember() throws Exception {
  27. // given
  28. Member mb = new Member(1, "hankgood95@gmail.com", "이욱재", true);
  29. String requestBody = obm.writeValueAsString(mb);
  30. mvc.perform(post("/member")
  31. .content(requestBody)
  32. .contentType(MediaType.APPLICATION_JSON))
  33. .andExpect(status().isOk()) //status가 200이고
  34. .andExpect(content().string(".com")) //content안에 .com이 있다면
  35. .andDo(print()); //요청받은것들으 print 해라
  36. }
  37. }

MemberController.java

  1. package com.prac.react.controller;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import com.prac.react.model.dto.Member;
  8. import com.prac.react.service.MemberService;
  9. /* 이파일은 회원가입,로그인,회원정보수정 등등
  10. 회원 정보와 관련된 일을 할때 들어올 Controller 입니다 */
  11. @RestController
  12. public class MemberController {
  13. //로그를 찍어보기 위해서 만든 인스턴스
  14. Logger logger = LoggerFactory.getLogger(MemberController.class);
  15. //MemberService 의존성 주입을 위해 사용할 인스턴스
  16. MemberService ms;
  17. public MemberController(MemberService ms){
  18. this.ms = ms; //의존성 주입
  19. }
  20. @PostMapping("member")
  21. public Member SignInMember(@RequestBody Member member){
  22. if(ms.checkMember(member.getEmail()) > 0){ //이미 우리 회원일때 접근
  23. //이미 우리 회원이라면 여기서 얻은 Member 정보를 가지고 메인페이지로 이동을 해야한다.
  24. member.setCheckMember(true);
  25. return member;
  26. }else{//처음 가입할때 접근
  27. //우리 회원이 아니라면 이제 회원가입 페이지로 이동을 해야한다.
  28. member.setCheckMember(false);
  29. return member;
  30. }
  31. }
  32. }

MemberService.java

  1. package com.prac.react.service;
  2. import org.springframework.stereotype.Service;
  3. import com.prac.react.model.dao.MemberDao;
  4. @Service
  5. public class MemberService {
  6. MemberDao md;
  7. //MemberDao 인스턴스의 의존성 주입을 위해 생성자 안에서 집어 넣어주었습니다.
  8. //여기서 주의해야할점은 의존성 주입이 하나 이상일땐 @Autowired 어노테이션을 꼭 넣어줘야만 합니다.
  9. public MemberService(MemberDao md){
  10. this.md = md;
  11. }
  12. public int checkMember(String email){
  13. return md.checkMember(email);
  14. }
  15. }
csga3l58

csga3l581#

当你使用测试片@WebMvcTest时:
使用@WebMvcTest注解时,不会扫描一般的@Component和@ConfigurationProperties Bean。
这意味着使用@Service标注的类也未配置。
您可以使用@MockBean为该服务创建一个模拟。
参考示例: Spring Boot 参考

相关问题