Spring

의존성 주입 테스트

인디아나쥰이 2020. 9. 18. 13:34

예제로 구성할 내용은 레스토랑 객체를 만들고 

레스토랑에서 일하는 셰프 객체를 주입하는 예제를 작성 

 

스프링에서의 의존성 주입 구현 

-생성자를 이용한 주입

-setter메서드를 이용한 주입 

 

 

 

1.예제를 작성하기 위해서 pom.xml에 추가하거나 혹은 변경할 라이브러리

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>  
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>    
cs

 

예제 클래스 생성 

 

org.zerock.sample 패키지의 Restaurant 클래스와 Chef 클래스 생성하기 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zerock.sample;
 
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import lombok.Data;
import lombok.Setter;
 
@Component //해당 클래스가 스프링에서 관리해야 하는 대상임을 표시 
@Data
public class Chef {
 
}
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
package org.zerock.sample;
 
import org.springframework.stereotype.Component;
 
import lombok.Data;
 
 
@Component
@Data
public class Chef {
 
}
cs

 

2-1 XML을 이용하는 의존성 주입 설정

 

-root-context.xml 클릭하고 아래쪽에 "NameSpaces"라는 탭을 클릭하여 'context'라는 항목 체크 

-root-context.xml의 source 탭을 클릭하여 아래의 코드 추가 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <!-- Root Context: defines shared resources visible to all other web components -->
 
<context:component-scan base-package="org.zerock.sample">
</context:component-scan>
        
</beans>
cs

 

2-2 Java 설정을 이용하는 의존성 주입

 

-'RootConfig' 클래스 이용 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zerock.config;
 
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
 
 
 
@Configuration
@ComponentScan(basePackages= {"org.zerock.sample"})
 
public class RootConfig {
 
}
 
cs

 

3.테스트 코드를 통한 확인 

 

3-1 XML 이용시 

 

'src/test/java' 폴더 내에 'org.zerock.sample.SampleTests' 클래스를 추가 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package org.zerock.sample;
 
import static org.junit.Assert.assertNotNull;
 
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.zerock.config.RootConfig;
 
import lombok.Setter;
import lombok.extern.log4j.Log4j;
 
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= { RootConfig.class })
@Log4j
public class SampleTests {
    
    @Setter(onMethod_ = { @Autowired }) //@Autowired는 해당 인스턴스 변수가 스프링으로 부터 자동으로 주입해달라는 표시.
    private Restaurant restaurant;
    
    @Test //테스트 대상을 표시하는 어노테이션.
    public void testExist() {
        
        assertNotNull(restaurant); //레스토랑 변수가 null이 아니어야만 테스트가 성공한다는것을 의미.
        
        log.info(restaurant);
        log.info("-------------");
        log.info(restaurant.getChef());
    }
}
cs

작성후 Run AS > Junit Test 를 실행해서 테스트 결과 확인 

 

실행되고 나면 

 

-new Restaurant( ) 와 같이 레스토랑 클래스에서 객체 생성 하지 않았음에도 불구하고 객체가 만들어짐

-Restaurant 클래스의 @Data 어노테이션으로 Lombok을 이용해서 여러 메서드가 만들어짐

-Restaurant 객체의 Chef 인스턴스에 Chef 타입의 객체가 주입되어 있음

 

실행결과의 의미는

 

테스트 코드가 실행되기 위해서 스프링 프레임워크가 동작 ->     동작 과정에서 필요한 객체들이 스프링에 등록됨

->의존성 주입이 필요한 객체는 자동으로 주입이 이루어짐

 

 

 

코드에 사용된 어노테이션들 

 

Lombok 

@Setter: setter 메소드를 생성 해주는 역할

 

@Setter에는 3가지 속성을 부여 할수 있음

1.value : 접근 제한 속성을 의미.

2.onMethod: setter 메서드의 생성시 메서드에 추가할 어노테이션을 지정

                     (예제의 경우 @Autowired)

3.onParam : setter메서드의 파라미터에 어노테이션을 사용하는 경우 

 

@Data

: @ToString, @EqualsAndHashCode,  @Getter/@Setter, @RequiredArgsConstructor 모두 결합한 형태

 

-@Log4: 로그객체를 생성

 

Spring

 

@Component: 해당클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시

@Autowired: 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당하는 타입의 빈을 주입해 주라는 표시

 

테스트 관련 어노테이션

 

@ContextConfiguration: 스프링이 실행되면서 어떤 설정 정보를 읽어들여야 하는지 명시

@Runwith : 테스트시 필요한 클래스를 지정

728x90
반응형