참여했던 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

+ Recent posts