test 작성하다 private 메소드를 만났음....

 

처음 접해본 private아이들......엄청 당황했지만....역시 구글!!!
...사실 private 은 안하는거라고 하지만.......커러버리 60% 이상해야해서 할수있는건 모두해야했다.....생각보다 달성 어려움...
1. 리턴타입이 있는것

class 별세계 {
    private int 동물원(int 지역코드, spring  지역명){
        .
        .
        .
        return 동물수;
    }

}
    //test클래스에 Mock객체로 미리 별세계를 선언함....
    @Autowired
    pvivate 별세계 별세계;

    //private 메소드를 사용할꺼라고 선언했다.\
    Method method = 별세계.getClass().getDeclaredMethod("동물원", int.class, spring.class);
    method.setAccessible(true);

    //given 
     int 지역코드 = 1234;
     spring 지역명 = "경상도";

    //when
    int 동물수 = (int)method.invoke(별세계, 지역코드, 지역명);

    //then 리턴값 자체를 확인하기 어렵다면
    assertThat(동물수).isNotNull();
    
    //또는 리턴값이 확인되어 정확히 일치하는지까지 원한다면
    int 동물수 = ReflectionTestUtils.invokeMethod(별세게, 동물원, 지역코드, 지역명)
	assertThat(동물수,is(동물수의 값));  //isEqualTo와 같은 기능

 

2. 리턴타입 없는 것.... 이건 정말 까다롭니다...verify가 있다고 하는데

 private에 리턴값이 없으니 test 결과를 어떻게 해야할지...한참을 해맸고..

https://effortguy.tistory.com/144

 

[Java] Mockito 사용법 (4) - 검증 (Verify)

이번 포스팅에선 Mockito를 이용해 스터빙한 메소드가 제대로 실행이 됐는지 확인해보는 메소드에 대해서 알아보겠습니다. 스터빙한 메소드를 검증하는 방법 verify 메소드를 이용해서 스터빙한

effortguy.tistory.com

방법도 있었으나.....이것도 void는 몰라도 private은 검색 어려웠다.

검색 끝에 

class 별세계 {
    private void 동물원(int 지역코드, spring  지역명){
        .
        .
        .
        send.내가 좋아하는 동물(호랑이);
	}       
}

}
 
//then 
  try {
    	method.invoke(service, unsuitableInfo, totalActionCount);
  } catch (Exception e) {
   	 e.printStackTrace();
  }

이건 사실 미완성이다....된다고 한게 아니라..일단 test만 통과하게 값을 채운거라서.......

다른 방법이 있다면 알려주세요~~~~~~제발~~~~

'junit TEST' 카테고리의 다른 글

Junit Test builder()  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16
JUNIT TEST 하기  (0) 2022.11.09

테스트 할때 클래스 값주는 방법을 배워서 기록 남겨둠!!!

@Builder

스프링 부트에서 요놈은 참 편리.....어노테이션이 다~ 그렇긴 하다!

@Getter
@Setter
@Builder
@NoArgsConstructor      //JPA나 json parser 쓸때 꼭있어야하고
@AllArgsConstructor	//생성자를 직접 선언하고 모든 생성자에 @Builder 쓸거아님...넣어야함/안넘에러
public class 강원도 {

	private int 인구수;
	private int 가수수;
	private spring 시;
	private spring 동;
	private spring 길;
}

가정하자.......내고향 뽀록난다....다시짜기 귀찮으니 패스!

강원도 k = 강원도.builder()
        .인구수(400000)
        .가구수(400000)
        .시("많은시")
        .동("많은동")
        .길("여러길")
        .build();

이렇게 값을 줄 수 있다.

만약 리스트로 요청한다면.....

List<강원도> kList = List.of(강원도.builder()
                    .인구수(400000)
                    .가구수(400000)
                    .시("많은시")
                    .동("많은동")
                    .길("여러길")
                    .build());

근데 강원도class를 다른 클래스에서 합쳐서 사용한다면....

class 산<T> implement Serialzable {
    private spring 명산;
    private int 국립공원수;
    private List<T> 지역;
}
// 가정하에.....

산<강원도> mountain = 산.<강원도>builder()
                    .명산("설악산")
                    .국립공원수(10)
                    .지역(kList)
                    .build();

 

라고 하면 되었음.......나중에 잘 대입하기 위해서 쉽게쉽게 만들어 봤음......

여기서 참고로  Serialzable 은 이분의 글을 참조하면 될듯.....한번읽어서는 이해안됨...ㅋㅋ

/https://nesoy.github.io/articles/2018-04/Java-Serialize 

 

Java의 직렬화(Serialize)란?

 

nesoy.github.io

난 여기서 enum도 적용한 분의 클래스도 값을 줘야 했다...

 

public enum 소유자 implements GenericEnum<String> {

	COMPANY("C", "기업"),
	USER("M", "개인"),
	NON_MEMBER("N", "없음");

	private final String value;
	private final String description;

}

여기서 GenericEnum의 적용 원리는 이분걸 참조 하면 도움될 듯

https://vvshinevv.tistory.com/78

 

Enum과 Generic 함께 사용하기

개요 코드를 단순하게 만들면서 가독성을 높히기 위한 개발을 하다보면 Enum 타입을 사용하는 것은 흔하게 일어납니다. 또한 if / else 문 사용을 지양하는 방향으로 코드를 만들다 보면 Enum 클래스

vvshinevv.tistory.com

아까 적용한 산 클래스에 적용 해보자...뭐 내용상 안맞지만....나중에 다시 할수만 있으면 되니깐...

class 산<T> implement Serialzable {
    private spring 명산;
    private int 국립공원수;
    private 소유자 owner;
    private List<T> 지역;
    
}

산<강원도> mountain = 산.<강원도>builder()
                    .명산("설악산")
                    .국립공원수(10)
                    .owner(소유자.COMPANY)
                    .지역(kList)
                    .build();

이럴때 Builder 로 값을 줄때는 owner(소유자.COMPANY)...쉽지만....이걸 클래스 설정할 때 미리 계산되어야 한다는거....

쉽지 않는 길.....

참고로 같이 쓰였던 어노테이션들....

@Builder.Default  변수윗줄 기재하고 변수의 기본값을 넣어주면 builder로 값을 주지 않아도 초기값을 반환한다.

 

@SuperBuilder  @Builder처럼 어떤 객체의 필드값들을 편하게 지정하기 위해서 사용한다. 다만, super라는 말에서처럼 부모 객체를 상속받는 자식 객체를 만들 때, 부모 객체의 필드값도 지정할 수 있게 하기 위해서 사용한다

만드는 방법은 같은데 부모클래스의 변수값도 같이 적용된다는 것임

 

@NotNull(message = "장치 타입은 필수값입니다.")  말그래도 null거부!! builder를 할때 너무긴건 빼고 몇개만 추려서 생성했는데 NPE가 뜨길래 왠가 봤더니 저런게 있었다........값을 안주면 반환하지 않겠다는 클래스의 강한집착...!!줘야지 뭐 별수 있나...

 

 

junit도 하면서 공부하게 된다.^^

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16
JUNIT TEST 하기  (0) 2022.11.09

참여했던 board의 Test를 해보고 싶었습니다.

가장 간단하게  글의 id를 부여하여 조회되는지 확인하는 것입니다.

package portal.control.web;  //경로 중요

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.Map;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import portal.commons.data.Box;
import portal.service.BoardService;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration   //이거 중요
@EnableWebMvc
@ContextConfiguration(locations = "classpath:conf/context-*.xml")
public class AdminBoardTest {

	@Autowired
	private BoardService boardService;
	// 잊지말자 접근제한자ㅜㅜ
	@Autowired
	private WebApplicationContext wac;

	private MockMvc mockMvc;

	@Before // JUINT껄로 임포트
	public void setup() {
		// mockMvc 사용하기 위해 builder와 wac객체를 이용하여 setup!
		this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
	}

	@Test
	public void testGetBoardList() {
		// fail("Not yet implemented"); 없다면 아무것도 검증하지 않으므로 성공임....
	}

	@Test
	public void testGoBoardInfoPop() {
		// fail("Not yet implemented");
		try {
			Box box = new Box();
			box.put("s_board_code", "NOTICE");
			box.put("program_code", "BOARD");
			box.put("action_mode", "modify");
			box.put("id", "64");
			Map view = boardService.getBoardView(box);
	
			assertNotNull(view);
		} catch (Exception e) {
	
		}
	}

	@Test
	public void testGoBoardInfoPopMock() {
		// MockMvc객체로 하는 테스트
		try {
			System.out.println(mockMvc);

			MultiValueMap<String, String> info = new LinkedMultiValueMap<>();

			info.add("s_board_code", "NOTICE");
			info.add("program_code", "BOARD");
			info.add("action_mode", "modify");
			info.add("id", "64");

			mockMvc.perform(get("mg/board/goBoardInfoPop.do") // 1, 2 perform 어떤 메소드,,, 어떤 url인가를 지정하는 것
					.params(info)) // 3
					.andDo(print())  //andDo 결과확인을 위해...print 콘솔에 출력
					.andExpect(status().isOk()).andReturn(); // 4 성공 할꺼를 예상하고 결과값중에 출력란것..

			assertTrue(true);

		} catch (Exception e) {

		}
	}

	@Test
	public void testGoBoardAction() {

		// fail("Not yet implemented");
	}

}

1. 패키지 경로 중요합니다. 그냥 대충 상위폴더에 만들고 진행했더니 에러 발생했습니다. 감싼 패키지name을 맞추고 진행했더니 되었습니다.

2 Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext  
//이 익셉션은 JVM이 내부의 클래스 정의 데이터 구조(class definition data structure)에서 Class를 찾지 못했다는 것을 나타낸다

Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
//이 익셉션은 Classpath에 로드하고자 하는 Class가 발견되지 않았을 때 발생한다. 보통은 빌드에 문제가 있는 경우로 clean이나 Class파일 삭제 후 재빌드를 수행하여 해결한다

이런에러가 발생했습니다....

servlet과 관련된 에러들이 계속 발생했다..... 프로젝트 업데이트를 해도 발생했는데 ....

어찌저지....Modulepath에 JRE만 남겨놓고 나머지는  Classpath쪽으로 이동시키니깐 저 에러는 해결되었음...

https://whitekeyboard.tistory.com/849

 

더보기

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.test.context.web.WebDelegatingSmartContextLoader]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:224)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:146)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:176)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.resolveContextLoader(AbstractTestContextBootstrapper.java:455)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:346)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:291)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:107)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:137)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:122)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:142)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28)
at org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:513)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext  
//이 익셉션은 JVM이 내부의 클래스 정의 데이터 구조(class definition data structure)에서 Class를 찾지 못했다는 것을 나타낸다

at org.springframework.test.context.web.WebDelegatingSmartContextLoader.<init>(WebDelegatingSmartContextLoader.java:63)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211)
... 29 more

Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
//이 익셉션은 Classpath에 로드하고자 하는 Class가 발견되지 않았을 때 발생한다. 보통은 빌드에 문제가 있는 경우로 clean이나 Class파일 삭제 후 재빌드를 수행하여 해결한다

at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 36 more

참고로 @WebAppConfiguration 넣으니 해결되었습니다.....^^

//그냥 여담인데...제가 이클립스 다운 받을때 잘못받았는지 source가 안보였습니다..... 이클립스 다운받을때 경량한거 안받기!!!!^^

더불어 남이한거 그냥 복붙해서 연습했더니 머리속에서 삭제된 것이 있었습니다. 바로 private관련.....

처음엔...@Autowired BoardService bService;  을 그냥 붙여서 넣었습니다...

그런데 우리는 이러면 되요 안되요....이러면 그냥 디폴트가 되잖아요??? 안되는거잖아요...

private//public //default//protected ///접근제한자 잊지말자!!!그중 기본은 private이다~~~~~

 

이렇게 해서 일단 BOX 형태로 값을 주어서 하는 방식은 금방 해결되었는데

2번째  

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

방식은 좀 어려웠습니다..

사실 스프링부트에서는 @ AutoConfigureMockMvc 걸면 자동으로 해결해주는데

지금 프로젝트는 부트가 아니라서 직접 pom 설정을 해야합니다.

이 2번째에서 계속

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /mg/board/goBoardInfoPop.do
       Parameters = {s_board_code=[NOTICE], program_code=[BOARD], action_mode=[modify], id=[64]}
          Headers = []
             Body = <no character encoding set>
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 404
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

더보기

13:43:41.637 [main] DEBUG org.springframework.test.web.servlet.TestDispatcherServlet - GET "/mg/board/goBoardInfoPop.do", parameters={masked}
13:43:41.638 [main] WARN org.springframework.web.servlet.PageNotFound - No mapping for GET /mg/board/goBoardInfoPop.do

java.lang.AssertionError: Status expected:<200> but was:<404>

1. DI설정...이건 pom이 없어서 잘모르겠으나  여러 xml파일통해서 문제가 없어보이고 앞선 test가 문제없어 패스

2. junit 설정...고쳐봤으나 해결안됨 

3. import....이클립스도 없다는걸 내가 발견할수 없어서 패스...

4. 매핑 주소.......문제.....일단 에러 검색시의 답도 그렇고 콘솔의 메세지도 그렇고 이쪽으로 기웁니다...

잠시 쉬었다가 고수님께 질문해서 답을 찾아야 할것 같습니다..ㅠㅠ

 

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Junit Test builder()  (0) 2023.02.22
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16
JUNIT TEST 하기  (0) 2022.11.09

마지막으로 TEST 배우고 있습니다.  늘 느끼지만 선생님께서 가르쳐 주실때는 엄청 간단한 것 같더니

내가하면 세상 그렇게 까다로울 수가 없습니다.

오늘은 TEST로 시험을 봤습니다......점수는 묻지 마세요..ㅠㅠ

암튼 시험예제를 구동시켜 보았습니다.

package com.sunit.verify.member.controller;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sunit.verify.member.service.MemberService;

@Controller
public class MemberController {

	@Autowired

	private MemberService service;

	@RequestMapping(value = "/beginSpring/memberRegister.action", method = { RequestMethod.POST })

	public ModelAndView memberRegisterEnd(HttpServletRequest request, ModelAndView mv) {

		try {

			String userid = request.getParameter("userid");

			String passwd = request.getParameter("passwd");

			String name = request.getParameter("name");

			String email = request.getParameter("email");

			String tel = request.getParameter("tel");

			HashMap<String, String> paraMap = new HashMap<String, String>();

			paraMap.put("userid", userid);

			paraMap.put("passwd", passwd);

			paraMap.put("name", name);

			paraMap.put("email", email);

			paraMap.put("tel", tel);

			int n = service.memberRegister(paraMap);

			String result = "";

			if (n == 1)

				result = "회원가입 성공!!";

			else

				result = "회원가입 실패!!";

			mv.addObject("result", result);

			mv.setViewName("memberRegisterResult");

		} catch (Exception e) {

			mv.addObject("error", "회원가입도중 오류가 발생하였습니다");

			mv.setViewName("error");

		}

		return mv;

	}

}

여기는 controller // 시험구문엔 반환형이 String이였는데 내가 돌리니깐 안되서 일단 이것도 ModelAanView로 변경

package com.sunit.verify.member.service;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MemberService {
	@Autowired
	private SqlSession session;
	public int memberRegister(HashMap<String, String> paraMap) {
		int result = session.insert("", paraMap);
		return 1;
	}

}

내가만든 service//// 시험구문엔 없었는데 controller에 보내는 구문이 있으니깐 그냥 만들어 봤고....mapper까지 만들라니 귀츈......도메인도 만들었는데...이건 다들 아실꺼라 pass

package com.sunit.verify.member;

import static org.junit.Assert.fail;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.queryParam;
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.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.sunit.verify.member.service.MemberService;

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
		,"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class MemberControllerTest {
	private static final Logger logger = LoggerFactory.getLogger(MemberControllerTest.class);
	@Autowired
	private WebApplicationContext wac;	
	private MockMvc mockMvc;

	
	@Before
	public void setup() {
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setup()완료~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
	}
	@Test
	public void testMemberRegister() throws Exception {
		//fail("Not yet implemented");
		logger.info("===== testMemberRegister() 메소드 시작 =====");
		try{
			((ResultActions) ((MockHttpServletRequestBuilder) mockMvc.perform(post("/beginSpring/memberRegister.action")))
			.param("userid", "leess")
			.param("passwd","qwer1234$")
			.param("name","이순신")
			.param("email","leess@gmail.com")
			.param("tel","01023456789"))
			.andDo(print())
			.andExpect(status().isOk());
			logger.info(">>> 테스트 수행 성공!!<<< ");
		}catch(Exception e) {
			logger.info("테스트 수행 실패 : ",e.getMessage());
		}
	}

}

TEST클래스.... 연습하다가 뜬금없이 깨달았는데

private static final Logger logger = LoggerFactory.getLogger(MemberControllerTest.class); 구문이

homeController에 있더라구요.......가까이 있었으나 몰랐던.. 눈뜬 장님이였어요.

암튼 MockMvc 생성하고 하라는 거 했고......

환경설정은 원래 해야하는거 그대로 했습니다.

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>   
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
	    <version>5.2.18.RELEASE</version>
		    <scope>test</scope>
		</dependency>

pom.xml 에 test 환경설정 해주고.....이건 이미 배웠는데  1가지 추가로

servlet 버전 안 맞는다고 변경하는거예요....이거 사실 전날 집에서 연습했을때 에러났던 부분인데

servlet버전이 안맞아서 변경하면 AspertJ 버전에서 빨간줄이 쳐져요.....이것도 같이 변경하라고는 하는데

어떻게 변경하라고는 안나오는건에요....찾기도 힘들고....그래서 어제는 그냥 에러상태로 뒀던건데..

오늘도 시험 문제서는 변경하라고 해서 그냥 변경했는데 역시나 빨간줄  x 표시 되죠...

근데 이번에는 어떻게 처리하는지 검색 성!공! 했습니다.

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>

바로바로바로

servlet 버전을 변경하면서 servlet-api  -->  javax.servlet-apl으로 변경

즉 javax. 를 추가하면 됩니다.

빨간 줄 삭제.....!!!!!!

그외에서 에러난게 많았으나......조금씩 정리해보는거죠...ㅋㅋ.....

servlet-context.xml 파일명 오타도 있고......

이런거 다 정리해서 돌려보는거지요.... test는 되었는데 결과값은 예외 오류 입니다..

여기서 부터는 잘모르겠어서 다음날 샘찬스 쓸겁니다........쓸수 있는 날짜도 얼마 안남았어요..ㅠㅠ

///////////////////////////////////////////////////////////////

controller수정.......여긴 크게 한게 없는데 이쁘게 정리^^

package com.sunit.verify.member.controller;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.sunit.verify.member.service.MemberService;

@Controller
public class MemberController {

	@Autowired
	private MemberService service;

	@RequestMapping(value = "/beginSpring/memberRegister.action", method = { RequestMethod.POST })
	public ModelAndView memberRegisterEnd(HttpServletRequest request, ModelAndView mv) {
		try {
			String userid = request.getParameter("userid");
			String passwd = request.getParameter("passwd");
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			String tel = request.getParameter("tel");

			HashMap<String, String> paraMap = new HashMap<String, String>();
			paraMap.put("userid", userid);
			paraMap.put("passwd", passwd);
			paraMap.put("name", name);
			paraMap.put("email", email);
			paraMap.put("tel", tel);
			int n = new MemberService().memberRegister(paraMap);
			String result = "";
			if (n == 1)
				result = "회원가입 성공!!";
			else
				result = "회원가입 실패!!";

			mv.addObject("result", result);
			mv.setViewName("memberRegisterResult");
		} catch (Exception e) {

			mv.addObject("error", "회원가입도중 오류가 발생하였습니다");

			mv.setViewName("error");

		}

		return mv;

	}

}

테스트 클래스 수정했어요....포함여부가 달랐더라구요.

package com.sunit.verify.member;

import static org.junit.Assert.fail;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.queryParam;
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.status;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.sunit.verify.member.service.MemberService;

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"
		,"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})
public class MemberControllerTest {
	private static final Logger logger = LoggerFactory.getLogger(MemberControllerTest.class);
	@Autowired
	private WebApplicationContext wac;	
	private MockMvc mockMvc;

	
	@Before
	public void setup() {
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setup()완료~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
	}
	@Test
	public void testMemberRegister() throws Exception {
		//fail("Not yet implemented");
		logger.info("===== testMemberRegister() 메소드 시작 =====");
		try{
			mockMvc.perform(
					post("/beginSpring/memberRegister.action")
					.param("userid", "leess")
					.param("passwd","qwer1234$")
					.param("name","이순신")
					.param("email","leess@gmail.com")
					.param("tel","01023456789"))
			.andDo(print())
			.andExpect(status().isOk());
			logger.info(">>> 테스트 수행 성공!!<<< ");
		}catch(Exception e) {
			logger.info("테스트 수행 실패 : ",e.getMessage());
		}
	}

}

service의 메소드 본문 삭제......할 수도 없는데 구문이 있어서 에러였습니다...

package com.sunit.verify.member.service;

import java.util.HashMap;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class MemberService {
	@Autowired
	private SqlSession session;
	
	public int memberRegister(HashMap<String, String> paraMap) {
		//int result = session.insert("", paraMap);
		return 1;
	}

}

여기저기서 조금씩 오점이 있었습니다.

이렇게 결과가 잘 나왔습니다.....

실제 개발시 jsp파일 없이도 할수 있는 부분은 이렇게 할것 같네요^^

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Junit Test builder()  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
JUNIT TEST 하기  (0) 2022.11.09

Junit 의 환경 설정

	<!-- test -->
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-test</artifactId>
		    <version>5.2.18.RELEASE</version>  <!--하단에 TEST Junit이 있는데 그냥 위에다 붙였다...자바 버전과 일치해야하기때문에 체크해야한다.  -->
		    <scope>test</scope>
		</dependency>
<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

pom.xml수정

 

@Repository
public class CustomerStoreLogic {
	@Autowired
	private SqlSession sqlSession;    //인터페이스 결합도를 약하게 하게 위해  //templi을 쓰면 결합도가 강해서 나중에 session으로 변경된다.
	
	public int registerCustomer(Customer customer) {
		int result = sqlSession.insert("",customer);
		return result;
	}

}

customer패키지// domain 패키지//store패키지와 클래스들 만들고 클래스만들면 get,set 기본생성자 매개변수 생성자 만들건 기본..

 

 

 

테스트의 클래스는 test파일에 한다.

이 폴더가 왜있나 했더니 이제서야 써본다..

coustomer 패키지 우클릭..클래스 만드는데.....좀 다름...

 

우클릭..new...other .. junit으로 검색해서 test Case 파일로 선택한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

여기서 테스트할 클래스를 선택한것이다. 아까만들었던 logic을 클래스를 선택하고 next를 해서 메소드 선택한다.

그럼 테스트에 이렇게 파일이 만들어 진다.

 

인제 여기서 작업을 한다.

 

package com.kh.junspring.customer;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.kh.junspring.customer.domain.Customer;
import com.kh.junspring.customer.store.CustomerStoreLogic;

@RunWith(SpringJUnit4ClassRunner.class)   //스프링에서 JUnit을 사용할수 있도록 하는 클래스  //부트에서는적을 필요는 없다.
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/root-context.xml"})  //중괄호는 여러개를 쓸수도 있다.
public class CustomerStoreLogicTest {
	
	@Autowired  //꼭 해줘야 한다.
	private CustomerStoreLogic store;
	@Test
	public void testRegisterCustomer() {
		//fail("Not yet implemented");
		Customer customer = new Customer();
		customer.setId("khuser01");
		customer.setName("일용자");
		customer.setAge(21);
		
		int result = store.registerCustomer(customer);
//		if(result==1) {
//			System.out.println("성공");
//		}else {
//			System.out.println("실패");
//		} 이것을 대신하여 작업할수 있게 해준다
		assertEquals(1,result);
		
	}

}

했는데 에러난다.....왜냐면 연결한 CustomerStoreLogic와 연결한 것을 찾을 수가 없었던것이다....이걸 직접 연결할수 있도록  @Repository 를 빼고 root-context.xml에 한줄 더 추가한다.

 

<bean id="customerStore" class="com.kh.junspring.customer.store.CustomerStoreLogic"></bean>

또는 

	"file:src/main/webapp/WEB-INF/spring/appServler/servlet-context.xml"})

넣으면 어노테이션으로 할 수도 있다.

그런데 어노테이션을 하려고 2번째방법을 썼더니...이해할수 없는 에러 발생.....

java.lang.IllegalStateException: WebApplicationObjectSupport instance [ResourceHttpRequestHandler ["/resources/"]] does not run in a ...

난 이게 먼지 잘 모르겠다.......servlet-context.xml 파일을 못읽는다는것라는데 잘모르겠음.....

역시 구글링..!!!! 

오류내용 그대로 했더니...

@WebAppConfiguration  붙이면 끝......

된다..^^

Member 로 연습

이건 에러가 난게 아닌다.....메소드가 5개 있는데 그중 한개만 작성해서 진행했고 그게 된거니깐^^ 결과물이 나온다.....앗싸!!!!!!

 

 

 

 

 

 

 

 

 

 

 

추가로 한개 더!! select값이 나오는데...에러는 아닌데 실패로 잡힌다.......한가지 빼머었다..

assertEquals("abcd4",mOne.getMemberId()); 결과값에 관련된 구문을 넣을때 예시다....

결과값중에..mOne.getMemberId() 의 결과값이 abcd4어야 정상이란 주문임..^^

 

 

'junit TEST' 카테고리의 다른 글

junit private method ...and void  (0) 2023.02.22
Junit Test builder()  (0) 2023.02.22
Test 연습하기  (0) 2023.02.01
TEST 로 --일단은 환경설정과 싸움/..완성시키기  (0) 2022.11.16

+ Recent posts