Junit
독립된 단위 테스트(Unit Test)를 지원해주는 프레임워크
테스트를 지원하는 Annotation을 제공
@Test
테스트를 수행하는 메소드
각 @Test 메소드가 호출될 때 마다 새로운 인스턴스(객체)를 생성하여 독립적인 테스트가 이루어지도록 한다
@Ignore
테스트를 실행하지 않게 한다
@Before
@Test 메소드가 실행되기 전에 반드시 실행된다
@Test 메소드에서 공통으로 사용하는 코드를 @Before 메소드에 선언하여 사용하면 된다
@After
@Test 메소드가 실행된 후 실행된다
@BeforeClass
@Test 메소드 보다 먼저 한번만 수행되어야 할 경우에 사용하면 된다
@AfterClass
@Test 메소드 보다 나중에 한번만 수행되어야 할 경우에 사용하면 된다
테스트 결과를 확인하는 단정(assert) 메소드
import static org.junit.Assert.*; 로 import하면 된다
AssertEquals(a, b); 객체 A와 B가 일치함을 확인한다 두 객체의 값이 같은지 확인
assertArrayEquals(a, b); 배열 A와 B가 일치함을 확인한다
assertSame(a, b); 객체 A와 B가 같은 객체임을 확인한다 / 두 객체의 reference가 동일한가를 확인한다(==연산자)
assertTrue(a); 조건 A가 참인가를 확인한다
assertNotNull(a); 객체 A가 null이 아님을 확인한다
fail([message]) - 테스트 실패로 판단
참조
http://junit.sourceforge.net/javadoc/org/junit/Assert.html
예외 테스트
@Test(expected=NumberFormatException.class)
시간 제한 테스트
@Test(timeout=1000)
테스트 무시
@Ignore(“”)
배열 지원
assertArrayEquals([message], expected, actual);
public class Junit4Exam { // 예외 테스트 @Test(expected = NumberFormatException.class) public void testException() throws Exception { String str = "hello"; System.out.println(Integer.parseInt(str)); } // 테스트 시간 제한 @Test(timeout = 1000) public void testTimeout() throws Exception { long sum = 0; for (int i = 0; i < 10000; i++) { for (int j = 0; j < 10000; j++) { sum += j; } } System.out.println(sum); } // 테스트 무시 @Ignore @Test public void testIgnore() throws Exception { assertTrue(false); } // 배열 지원 - 값이랑 순서까지 동일해야 한다 @Test public void testAssertArrayEquals() throws Exception { Object[] a = {"Java", "Python", 1}; Object[] b = {"Java", "Python", 1}; assertArrayEquals(a, b); } | cs |
Spring-test
Spring TestContext Framework이다
스프링과 MyBitis가 정상적으로 연동되었는지 확인하기 위해 필요한 라이브러리
@RunWith(클래스 이름.class)
@RunWith(SpringJUnit4Class.Runner.class)
스프링의 테스트 컨텍스트 프레임워크 JUnit 확장 기능 지정
Junit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하기에 @Test 마다 오브젝트(객체)를 생성한다
이와 같은 Junit의 특성으로 인하여 ApplicationContext도 매번 새로 생성되기 때문에 테스트가 느려지는 단점이 존재
그러나 @RunWith 애노테이션은 각각의 테스트 별로 오브젝트가 생성 되더라도 싱글톤의 ApplicationContext를 보장한다
@RunWith() 대신 AbstractJUnit4SpringContextTests를 상속받아 사용할 수도 있다
JUnit Test 클래스를 실행하기 위한 러너(Runner)를 명시적으로 지정한다
@RunWith는 junit.runner.Runner를 구현한 외부 클래스를 인자로 갖는다
@RunWith(SpringJUnit4ClassRunner.class)
Junit 프레임워크의 테스트 실행 방법을 확장할 때 사용하는 Annotation
SpringJUnit4ClassRunner.class 클래스를 지정해주면 Junit이 테스트를 진행하는 중에
ApplicationContext를 만들고 관리하는 작업을 진행해 준다
특징: JUnit에서 Spring 설정을 그대로 사용할 수 있다
테스트 케이스에서 스프링에서 설정한 Bean을 Injection 받아서 사용 가능
org.junit.runners.BlockJUnit4ClassRunner 클래스를 상속받아 구현됨
SpringJUnit4ClassRunner.class라는 Junit용 테스트 컨텍스트 프레임워크 확장 클래스를 지정해주면 Junit이 테스트를 진행하는 중에 테스트가 사용할 애플리케이션 컨텍스트를 만들고 관리하는 작업을 진행해준다
Junit에 내장된 Runner 대신 그 클래스를 실행하게 된다
한 클래스 내에 여러 개의 테스트가 있더라도 어플리케이션 컨텍스트를 초기 한번만 로딩하여 사용하므로 여러 개의 테스트가 있더라도 처음 테스트만 조금 느리고 그 뒤의 테스트들은 빠르다
싱글톤
전체 프로그램에서 단 하나의 객체(인스턴스)만 만들도록(생성하도록) 보장해야할 때가 있다
그래서 단 하나만 생성된다고 해서 싱글톤(Singleton)이라고 부른다
즉, 싱글톤은 공용으로 사용하는 클래스에 적용하기에 적절하다
(ex. DB 커낵션 풀)
싱글톤의 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class cSingleton { private static cSingleton _instance = null; public static cSingleton Instance { get { if (_instance == null) _instance = new cSingleton(); return _instance; } } } | cs |
3: 외부에서 접근하지 못하게 접근자는 private를 사용 / 자신의 객체를 만들어둔다
5: 외부에서 접근가능한 메소드 생성
9: 처음 singleton을 호출했을 떄는 자신의 인스턴트가 null값이다
그러니 인스턴스를 new 키워드를 사용해 생성해준다
한번 호출한 뒤에는 다시 singleton을 호출해도 instance는 static이기 때문에
null값이 아닐 것이고 현재 메모리에 한 객체이상 존재할 수 없다
11 : 만들어진 혹은 존재하는 인스턴스를 반환
@ContextConfiguration
스프링 빈(Bean) 설정 파일의 위치를 지정할 때 사용
File과 classpath 접근방식이 있고 자동으로 만들어줄 애플리케이션 컨텍스트의 설정 파일 위치를 지정한다
spring bean 메타 설정 파일의 위치를 지정할 때 사용되는 애노테이션이며 경로를 지정하지 않으면
테스트 클래스 파일이 있는 패키지 내에서 다음의 설정 파일을 사용한다
ContextConfigLocationTest-context.xml
contextconfiglocationtest-context.xml
@Autowired
해당 변수에 자동으로 빈(Bean)을 매핑해준다
Spring에서 Bean을 찾아 자동으로 수정자 메소드나 필드에 넣어주는 annotation
@Autowired(required = false)로 하게 되면
스프링 설정파일에 등록된 빈 객체가 없더라도 예외를 발생시키지 않게 된다(기본으로 true)
(injection되는 같은 타입의 bean이 컨테이너 안에 존재하지 않는 경우 / injection되는 타입이 여러 개 있는 경우)
세가지 어노테이션 @Autowired, @Resource,@Inject은 모두 의존관계를 자동으로 연결해주는 기능을 가진 어노테이션이다.
약간의 차이가 있다
@Autowired and @Inject
타입으로 매치
@Qualifiers 로 매칭 제한
이름으로 매치
@Resource
이름으로 매치
타입으로 매치
@Qualifier 로 매칭 제한(만약 이름으로 찾은 경우라면 무시)
|
@Autowired |
@Inject |
@Resource |
범용 |
스프링 전용 |
자바에서 지원 |
자바에서 지원 |
연결 방식 |
타입에 맞춰서 연결 |
타입에 맞춰서 연결 |
이름으로 연결 |
@Inject와 @Resource는 JSR에 실려있는 자바 기존의 어노테이션이다
@Autowired의 경우에는 스프링에서 등장한 어노테이션이다 / 스프링 이외에서는 사용 할 수 없습니다
프로젝트를 스프링에서 다른 프레임워크로 바꿀 생각이 있다면 @Autowired보단 @Inject나 @Resource를 쓰면 된다
또한 연결 방식은 @Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결하게 됩니다. 예를 들어보겠습니다.
참조: http://blog.naver.com/platinasnow/220053030295
'IT > Spring' 카테고리의 다른 글
MVC 모델, MVC 패턴 이란? (0) | 2017.11.08 |
---|---|
DAL / BLL / PL 패턴, 구조란? (0) | 2017.11.08 |
Eclipse Project Import 하는 법 (0) | 2017.11.07 |
Maven oracle jdbc 연결하기 (0) | 2017.09.12 |