Home > front end >  Spring boot @RestController test code error
Spring boot @RestController test code error

Time:07-20

I created a test code for @RestController on the spring boot and this error occurs.

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

I see this problem even though I added @Service annotations to the MemberService class and @RestController annotations to the MemberController class. How can I solve it?

I'll show my Test code, MemberCotroller, MemberService code below

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, "[email protected]", "이욱재", 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);
    }
}

CodePudding user response:

When you using the test slice @WebMvcTest:

Regular @Component and @ConfigurationProperties beans are not scanned when the @WebMvcTest annotation is used.

This means your class annotated with @Service is also not configured.

You can use @MockBean to create a mock for this service.

Reference with Example: Spring Boot Reference

  • Related