- JUNIT 이란?
- 테스트에서 v-model 에 대하여 설명하시오.
- 소프트웨어 개발에서 폭포수 모델에 대하여 설명하시오
- v-model 에 대하여 설명하시오.
- 단위 테스트 , 통합 테스트, 인수 테스트에 대하여 설명하시오.
- Spring에서, 커넥션 풀 테스트 코드를 코딩 하시오.
- 스프링 컨트롤러를 테스트 하는 2가지 방법은?
- 게시판에서 페이징시 2페이지 10개의 값을 확인 하도록 테스트 코드를 작성하시오.

단위 테스트
- 주로 메서드 수준으로 단위를 정하여 테스트
통합 테스트
- 여러 모듈을 모아, 의도대로 협력되는지 여부를 확인하는 테스트
- 현재 배우는 상황에서는 클래스 기준으로 테스트하는 것을 통합 테스트로 표현
인수 테스트
- 사용자 스토리(시나리오)에 맞춰 수행하는 테스트
-> 다른 의사소통집단으로부터 시나리오를 받아 개발한다는 의미
- 요구사항대로 잘 작동되는가를 따지는 것
ConnectionPoolTest 파일
- 수업 전 개인작성해본 코드
package edu.sejong.ex.database;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
class DataBaseTest {
@Autowired
private DataSource dataSource;
@Test
void testDataSource() {
assertNotNull(dataSource);
log.info("DS = " + dataSource);
}
@Test
void testConnection() throws SQLException{
Connection connection = dataSource.getConnection();
log.info("== connection == : " + connection.toString());
assertNotNull(connection);
connection.close();
}
}

수업 내용을 반영하여 수정한 파일
package edu.sejong.ex.database;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
class DataBaseTest {
@Autowired
private DataSource dataSource;
@Test
void testDataSource() {
assertNotNull(dataSource);
log.info("DS = " + dataSource);
}
@Test
void testConnection(){
try (Connection connection = dataSource.getConnection();){
log.info("== connection == : " + connection.toString());
assertThat(connection).isInstanceOf(Connection.class);
assertEquals(100, getLong(connection,"select 100 from dual"));
} catch (Exception e) {
e.printStackTrace();
}
}
public long getLong(Connection connection, String sql) {
long result = 0;
try(Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql)){
if(rs.next()) {
result = rs.getLong(1);
}
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
}

@ExtendWith(MockitoExtension.class)
해당 annotation을 해야 MockitoExtension 객체(Mock 객체)를 가져올 수 있음.
@Autowired
private MockMvc mockMvc; // HTTP 호출을 위한 MockMVC 사용
MockMvc : 웹 브라우저 역할을 함.
@BeforeEach// JUNIT4에서는 @Before였다고.
void setUp() {
mockMvc = MockMvcBuilders.standaloneSetup(new HomeController()).build();
}
@BeforeEach : 실행되기 전 먼저 처리해야 하는 것들을 처리.
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureMockMvc : IOC컨테이너에 MockMvc 를 집어넣고, 이를 꺼내쓸 수 있도록 한다.
MockMvc를 사용하는 것까진 동일하지만, @BeforeEach는 사용하지 않음.
대신, import시켜야 하는 클래스 개수가 많음.
package edu.sejong.ex.controller;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
class BoardControllerTest {
@Autowired
private MockMvc mockMvc;
@Disabled
@Test
void testHome() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/board/list"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
@Disabled
@Test
void testBoard() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
@Test
void testBoardLists() throws Exception{
// mockMvc.perform(MockMvcRequestBuilders.get("/board/list2?pageNum=1&amount=10"))
// .andExpect(MockMvcResultMatchers.status().isOk())
// .andDo(print());
mockMvc.perform(MockMvcRequestBuilders.get("/board/list2")
.param("pageNum", "2")
.param("amount", "10"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
@Disabled
@Test
void testBoardJson() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/boards/list"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
}
request에 데이터가 전달되는 걸 확인할 수 있음.

이전에 개인적으로 작성했던 내용이며, 질문의 의도를 잘못 이해하긴 했지만 다른 부분을 체크(ModelAndView에 데이터가 있느냐)할 때 사용하게 될 것
package edu.sejong.ex.controller;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
class BoardControllerTest {
@Autowired
private MockMvc mockMvc;
@Disabled
@Test
void testHome() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/board/list"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
@Test
void testBoard() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/board/list2"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.view().name("/board/boardlist2"))
.andExpect(MockMvcResultMatchers.model().attributeExists("boards"))
.andExpect(MockMvcResultMatchers.model().attributeExists("pageMaker"))
.andExpect(MockMvcResultMatchers.model().attribute("pageMaker", Matchers.hasProperty("criteria")))
.andExpect(MockMvcResultMatchers.model().attribute("pageMaker", Matchers.hasProperty("criteria", Matchers.hasProperty("pageNum", equalTo(1)))))
.andExpect(MockMvcResultMatchers.model().attribute("pageMaker", Matchers.hasProperty("criteria", Matchers.hasProperty("amount", equalTo(10)))))
.andDo(print());
}
@Disabled
@Test
void testBoardJson() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/boards/list"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
}
