PDH 개발 공부
Junit 본문
Junit
Junit이란?
- 테스트 함수를 단일 패키지로 묶을 수 있으며 다양한 검증 함수를 지원해 프로그램이 반복적으로 수정되는 프로그램 개발 과정에서 테스트 케이스를 반복적으로 적용할 수 있다.
- 단위 테스트 시간을 획기적으로 줄일 수 있을 뿐만 아니라 테스트 품질도 향상 할 수 있다.
pom.xml 등록
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 기존 테스트에서 확장하기 위한 Api -->
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.19.0</version>
<scope>test</scope>
</dependency>
Spring-Test
- Junit을 확장한 스프링의 테스트 라이브러리
- 스프링에서의 MVC 프로젝트에서 코드 테스트 할 대마다 답답한 경우가 많다.
- 즉 프로젝트의 자원을 이용하면서도 필요한 코드만 간단하게 테스트 가능 하게 함.
- 테스트를 하기 위한 코드는 src/test/java , src/test/resources 폴더 안에 넣고 사용 하면 된다.
Junit의 테스트 지원 어노테이션
@Test
- 테스트를 수행하는 메소드를 지정한다. jUnit에서는 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행되는 것을 지향한다. 따라서 @Test 단위 마다 필요한 객체를 생성해 지원해줌
@Ignore
- 테스트를 실행하지 않도록 해준다. 메소드는 남겨두되 테스트에 포함되지 않도록 하려면 이 어노테이션을 붙여두면 됨
@Before / @After
- 테스트 메소드가 실행되기 전, 후로 항상 실행되는 메소드를 지정한다. 공통적으로 실행되어야 하는 메소드가 있다면 어노테이션을 붙여주면 됨. 각각의 테스트 메소드에 적용
@BeforeClass / @AfterClass
- 각각의 메소드가 아닌 해당 클래스에서 딱 한번만 수행되는 메소드.
테스트 메소드의 갯수와 상관없이 딱 한번만 실행된다.
Spring-Test의 어노테이션
@RunWith(SpringJUnit4ClassRunner.class)
- ApplicationContext를 만들고 관리하는 작업을 할 수 있도록 jUnit의
기능을 확장
- Spring-Test 라이브러리로 확장된 jUnit에서는
컨테이너 기술을 써서 싱글톤으로 관리되는 객체를 사용 (JUnit에서는 테스트 메소드별로 객체를 따로 생성해 관리하는 반면 )
@ContextConfiguration(locations = "classpath:xml")
Bean을 등록해둔 xml 파일을 지정해 컨테이너에서 사용할 수 있도록 해준다
@ContextConfiguration(classes = 자바.class)
class안에 bean 으로 등록해 놓은 컨테이너 에서 사용 할 수 있도록 해준다.
##Context에서 데이터 핸들링
Java 클래스 등록된 Bean 찾기
@Autowired
User user;
// Java Config
// 직접 설정 자바 클래스를 전달
// 설정 클래스에 @Configuration 필요 없다
@Test
public void testAppconfig01() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig01.class);
User user = ac.getBean(User.class);
assertNotNull(user);
}
// java config02
// 자바 설정 클래스가 있는 베이스 패키지를 전달
// 설정 클래스에 @Configuration이 반드시 필요하다.
@Test
public void testAppconfig02() {
ApplicationContext ac = new AnnotationConfigApplicationContext("com.douzone.container.config.user");
User user = ac.getBean(User.class);
System.out.println(user);
((ConfigurableApplicationContext) ac).close();
}
XML 에 등록된 Bean으로 찾는법
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/com/douzone/container/config/user/applicationContext02.xml"})
public class XmlConfigTest {
@Autowired
private User user;
@Test
public void testUserNotNull() {
assertNotNull(user);
}
}
Junit 테스트 실전 01 (class 내의 컴포넌트 스캐닝으로 구성 (암시적)
CDPlayerJavaConfigTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerJavaConfigTest {
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule();
@Autowired
private CDPlayer cdPlayer;
@Test
public void testCDPlayerNotNull() {
assertNotNull(cdPlayer);
}
@Test
public void testPlay() {
cdPlayer.play();
assertEquals("Playing 붕붕by김하은", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
}
CDPlayerConfig.java
@Configuration
@ComponentScan(basePackages={"com.douzone.container.soundsystem"})
public class CDPlayerConfig {
}
Junit 테스트 실전 02 (XML에서 찾기 (@Componet 스캔 (암시적))
CDPlayerXmlConfigTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:com/douzone/container/config/soundsystem/CDPlayerConfigContext.xml"})
public class CDPlayerXmlConfigTest {
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule();
@Autowired
private CDPlayer cdPlayer;
@Test
public void testCDPlayerNotNull() {
assertNotNull(cdPlayer);
}
@Test
public void testPlay() {
cdPlayer.play();
assertEquals("Playing 붕붕by김하은", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
CDPlayerConfigContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<context:annotation-config />
<context:annotation-config />
<context:component-scan
base-package="com.douzone.container.soundsystem">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Component" />
</context:component-scan>
</beans>
Junit 테스트 실전 03 (class 어노테이션 Bean설정으로 찾기 (명시적))
DVDPlayerJavaConfigTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DVDPlayerConfig.class)
public class DVDPlayerJavaConfigTest {
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule();
@Autowired
private DigitalVideoDisc dvd;
// 같은 타입의 빈이 2개 이상 존재하는 경우 1:
// 설정 클래스의 빈생성 메소드 이름
// @Qualifier("dvdPlayer03")
// 같은 타입의 빈이 2개 이상 존재하는 경우 1:
// 설정 클래스의 빈생성 메소드 이름 @Bean의 name 속성
@Qualifier("player04")
@Autowired
private DVDPlayer player;
@Test
public void testDVDNotNull() {
assertNotNull(dvd);
}
@Test
public void testPlayerNotNull() {
assertNotNull(player);
}
@Test
public void testPlay() {
player.play();
assertEquals("" , systemOutRule.getLog().replace("\r\n", "").replace("\n",""));
}
}
DVDPlayerConfig.java
@Configuration
public class DVDPlayerConfig {
@Bean
public Avengers avengers() {
return new Avengers();
}
// 주입(Injection)하기1:
// 파라미터 : Bean 생성 메소드 직접 호출 :
// 생성자 주입
// @Bean
public DVDPlayer dvdPlayer01() {
return new DVDPlayer(avengers());
}
// 주입(Injection)하기2:
// 파라미터 : Bean 전달하기
// 생성자 주입
// @Bean
public DVDPlayer dvdPlayer02(DigitalVideoDisc dvd) {
return new DVDPlayer(dvd);
}
// 주입(Injection)하기2:
// 파라미터 : Bean 전달하기
// setter 주입
@Bean
public DVDPlayer dvdPlayer03(DigitalVideoDisc dvd) {
DVDPlayer player = new DVDPlayer();
player.setDvd(dvd);
return player;
}
// 같은 타입의 빈을 생성할 경우
@Bean(name = "player04")
public DVDPlayer dvdPlayer04(DigitalVideoDisc dvd) {
DVDPlayer player = new DVDPlayer();
player.setDvd(dvd);
return player;
}
}
Junit 테스트 실전 04 (xml내의 Bean 으로 찾기 (명시적) )
DVDPlayerXmlConfigTest.java
package com.douzone.container.config.videosystem;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.contrib.java.lang.system.SystemOutRule;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.douzone.container.videosystem.DVDPack;
import com.douzone.container.videosystem.DVDPlayer;
import com.douzone.container.videosystem.DigitalVideoDisc;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:com/douzone/container/config/videosystem/DVDPlayerConfig.xml"})
public class DVDPlayerXmlConfigTest {
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();
// @Autowired
// 예외 발생
// XML Bean 설정 시 id는 자동으로 부여 되지 않는다.
// @Qualifier 사용 불가
private DigitalVideoDisc dvd1;
@Autowired
@Qualifier("ironMan")
private DigitalVideoDisc dvd2;
@Autowired
@Qualifier("avengersInfinityWar")
private DigitalVideoDisc dvd3;
@Autowired
@Qualifier("avengersEndgame")
private DigitalVideoDisc dvd4;
@Autowired
@Qualifier("avengersAgeOfUltron")
private DigitalVideoDisc dvd5;
@Autowired
@Qualifier("captainAmerica")
private DigitalVideoDisc dvd6;
@Autowired
@Qualifier("avengersDirectorEdition")
private DigitalVideoDisc dvd7;
@Autowired
@Qualifier("avengersExpansionPack1")
private DigitalVideoDisc dvd8;
@Autowired
@Qualifier("avengersExpansionPack2")
private DigitalVideoDisc dvd9;
@Autowired
@Qualifier("avengersExpansionPack3")
private DigitalVideoDisc dvd10;
@Autowired
@Qualifier("avengersTriplepack")
private DVDPack dvdPack;
@Autowired
@Qualifier("dvdPlayer1")
private DVDPlayer player1;
@Autowired
@Qualifier("dvdPlayer2")
private DVDPlayer player2;
@Autowired
@Qualifier("dvdPlayer3")
private DVDPlayer player3;
@Autowired
@Qualifier("dvdPlayer4")
private DVDPlayer player4;
@Autowired
@Qualifier("dvdPlayer5")
private DVDPlayer player5;
@Ignore
@Test
public void testDVD1() {
assertNotNull(dvd1);
}
@Test
public void testDVD2() {
assertNotNull(dvd2);
}
@Test
public void testDVD3() {
assertNotNull(dvd3);
}
@Test
public void testDVD4() {
assertNotNull(dvd4);
}
@Test
public void testDVD5() {
assertNotNull(dvd5);
}
@Test
public void testDVD6() {
assertNotNull(dvd6);
}
@Test
public void testDVD7() {
assertNotNull(dvd7);
}
@Test
public void testDVD8() {
assertNotNull(dvd8);
}
@Test
public void testDVD9() {
assertNotNull(dvd9);
}
@Test
public void testDVD10() {
assertNotNull(dvd10);
}
@Test
public void testDVDPack() {
assertNotNull(dvdPack);
}
@Test
public void testPlay1() {
player1.play();
assertEquals("Playing Movie MARVEL's IronMan", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
@Test
public void testPlay2() {
player2.play();
assertEquals("Playing Movie MARVEL's IronMan", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
@Test
public void testPlay3() {
player3.play();
assertEquals("Playing Movie MARVEL's IronMan", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
@Test
public void testPlay4() {
player4.play();
assertEquals("Playing Movie MARVEL's Avengers Director Edition", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
@Test
public void testPlay5() {
player5.play();
assertEquals("Playing Movie MARVEL's Avengers Director Edition", systemOutRule.getLog().replace("\r\n", "").replace("\n", ""));
}
}
DVDPlayerConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 초간단 빈 설정 -->
<bean class="com.douzone.container.videosystem.Avengers" />
<!-- 01. 설정 빈에 아이디 부여하기 -->
<bean id="ironMan" class="com.douzone.container.videosystem.IronMan" />
<!-- 02. 빈 설정 - 생성자 리터럴 사용1 -->
<bean id="avengersInfinityWar" class="com.douzone.container.videosystem.BlankDisc">
<constructor-arg name="title" value="Avengers Infinity War"/>
<constructor-arg name="studio" value="MARVEL"/>
</bean>
<!-- 03. 빈 설정 - 생성자 리터럴 사용2 -->
<bean id="avengersEndgame" class="com.douzone.container.videosystem.BlankDisc"
c:title="Avengers Endgame"
c:studio="MARVEL" />
<!-- 04. 빈 설정 - 생성자 인덱스 사용 -->
<bean id="avengersAgeOfUltron" class="com.douzone.container.videosystem.BlankDisc"
c:_0="Avengers Age of Ultron"
c:_1="MARVEL" />
<!-- 05. 빈 설정 - 생성자 null argument -->
<bean id="captainAmerica" class="com.douzone.container.videosystem.BlankDisc">
<constructor-arg name="title" value="Avengers Captain America"/>
<constructor-arg name="studio" value="MARVEL"/>
<constructor-arg name="actors"><null/></constructor-arg>
</bean>
<!-- 06. 빈 설정 - 생성자 collection argument -->
<bean id="avengersDirectorEdition" class="com.douzone.container.videosystem.BlankDisc">
<constructor-arg name="title" value="Avengers Director Edition"/>
<constructor-arg name="studio" value="MARVEL"/>
<constructor-arg name="actors">
<list>
<value>Robert Downey Jr.</value>
<value>Scarlett</value>
<value>Chris Evans</value>
</list>
</constructor-arg>
</bean>
<!-- 07. 빈 설정 - 생성자 wiring collection -->
<bean id="avengersTriplepack" class="com.douzone.container.videosystem.DVDPack">
<constructor-arg name="title" value="Avengers Triplepack"/>
<constructor-arg name="dvds">
<list>
<ref bean="avengersEndgame" />
<ref bean="avengersInfinityWar" />
<ref bean="avengersAgeOfUltron" />
</list>
</constructor-arg>
</bean>
<!-- 08. 빈 설정 - 프로퍼티를 통한 빈 초기화1 -->
<bean id="avengersExpansionPack1" class="com.douzone.container.videosystem.BlankDisc">
<property name="title" value="Avengers Expansion Pack1"/>
<property name="studio" value="MARVEL"/>
<property name="actors">
<list>
<value>Robert Downey Jr.</value>
<value>Scarlett</value>
<value>Chris Evans</value>
</list>
</property>
</bean>
<!-- 09. 빈 설정 - 프로퍼티를 통한 빈 초기화2 -->
<bean id="avengersExpansionPack2" class="com.douzone.container.videosystem.BlankDisc"
p:title="Avengers Expansion Pack2"
p:studio="MARVEL">
<property name="actors">
<list>
<value>Robert Downey Jr.</value>
<value>Scarlett</value>
<value>Chris Evans</value>
</list>
</property>
</bean>
<!-- 10. 빈 설정 - 프로퍼티를 통한 빈 초기화3 -->
<util:list id="actorList">
<value>Robert Downey Jr.</value>
<value>Scarlett</value>
<value>Chris Evans</value>
</util:list>
<bean id="avengersExpansionPack3" class="com.douzone.container.videosystem.BlankDisc"
p:title="Avengers Expansion Pack3"
p:studio="MARVEL"
p:actors-ref="actorList" />
<!-- 11. 생성자를 통한 빈 주입1 -->
<bean id="dvdPlayer1" class="com.douzone.container.videosystem.DVDPlayer">
<constructor-arg ref="ironMan"/>
</bean>
<!-- 12. 생성자를 통한 빈 주입2: c-namespace의 argument name을 사용하는 방법(Spring 3.x 부터 지원)-->
<bean id="dvdPlayer2" class="com.douzone.container.videosystem.DVDPlayer"
c:dvd-ref="ironMan"/>
<!-- 13. 생성자를 통한 빈 주입3: c-namespace의 argument index을 사용하는 방법(Spring 3.x 부터 지원)-->
<bean id="dvdPlayer3" class="com.douzone.container.videosystem.DVDPlayer"
c:_0-ref="ironMan"/>
<!-- 13. 프로퍼티를 통한 빈 주입1 -->
<bean id="dvdPlayer4" class="com.douzone.container.videosystem.DVDPlayer">
<property name="dvd" ref="avengersDirectorEdition"/>
</bean>
<!-- 13. 프로퍼티를 통한 빈 주입2: p:namspace 사용 -->
<bean id="dvdPlayer5" class="com.douzone.container.videosystem.DVDPlayer" p:dvd-ref="avengersDirectorEdition" />
</beans>
'WEB Programing > Spring' 카테고리의 다른 글
MessageConverter (0) | 2021.07.03 |
---|
Comments