PDH 개발 공부

Junit 본문

WEB Programing/Spring

Junit

IFBB 2021. 7. 2. 22:32

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