junit Spring Boot @RestController测试代码错误

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

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

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)

---------------------------------------------------------------------------

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: {}

--------------------------------------------------------------------------------------------------
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

package com.prac.react.controller;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.prac.react.model.dto.Member;
import com.prac.react.service.MemberServiceTest;

@WebMvcTest(MemberController.class)
public class MemberControllerTest {

    @Autowired
    MockMvc mvc; // 가상의 http request를 테스트 할때 만들기 위해서 사용하는 인스턴스
    @Autowired
    ObjectMapper obm; 

    Logger logger = LoggerFactory.getLogger(MemberServiceTest.class);

    @Test
    @DisplayName("로그인 테스트 1 ") // 회원이 존재할때를 가장했을때를 위한 테스트 코드
    void testSignInMember() throws Exception {
        // given
        Member mb = new Member(1, "hankgood95@gmail.com", "이욱재", true);

        String requestBody = obm.writeValueAsString(mb);
        mvc.perform(post("/member")
                .content(requestBody)
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk()) //status가 200이고
                .andExpect(content().string(".com")) //content안에 .com이 있다면 
                .andDo(print()); //요청받은것들으 print 해라
    }
}

MemberController.java

package com.prac.react.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.prac.react.model.dto.Member;
import com.prac.react.service.MemberService;

/* 이파일은 회원가입,로그인,회원정보수정 등등
 회원 정보와 관련된 일을 할때 들어올 Controller 입니다 */

@RestController
public class MemberController {

    //로그를 찍어보기 위해서 만든 인스턴스
    Logger logger = LoggerFactory.getLogger(MemberController.class);
    //MemberService 의존성 주입을 위해 사용할 인스턴스
    MemberService ms;

    public MemberController(MemberService ms){
        this.ms = ms; //의존성 주입
    }

    @PostMapping("member")
    public Member SignInMember(@RequestBody Member member){

        if(ms.checkMember(member.getEmail()) > 0){ //이미 우리 회원일때 접근
            //이미 우리 회원이라면 여기서 얻은 Member 정보를 가지고 메인페이지로 이동을 해야한다.
            member.setCheckMember(true);
            return member;
        }else{//처음 가입할때 접근
            //우리 회원이 아니라면 이제 회원가입 페이지로 이동을 해야한다.
            member.setCheckMember(false);
            return member;
        }
    }
}

MemberService.java

package com.prac.react.service;

import org.springframework.stereotype.Service;

import com.prac.react.model.dao.MemberDao;

@Service
public class MemberService {

    MemberDao md;

    //MemberDao 인스턴스의 의존성 주입을 위해 생성자 안에서 집어 넣어주었습니다.
    //여기서 주의해야할점은 의존성 주입이 하나 이상일땐 @Autowired 어노테이션을 꼭 넣어줘야만 합니다.
    public MemberService(MemberDao md){
        this.md = md;
    }

    public int checkMember(String email){
        return md.checkMember(email);
    }
}
csga3l58

csga3l581#

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

相关问题