JUnit에서 테스트 클래스의 생성자를 사용하는 방법은?
_____A1: 네, JUnit 4와 JUnit 5 모두 테스트 클래스에 생성자를 사용할 수 있습니다. 그러나 기본적으로 JUnit은 각 테스트 메서드 실행 전에 새로운 테스트 클래스 인스턴스를 생성하기 때문에, 생성자는 각 테스트 실행 시마다 호출됩니다.
---
Q2: 생성자를 사용하는 주된 이유는 무엇인가요?
A2: 생성자를 통해 테스트 인스턴스의 초기 상태를 설정할 수 있습니다. 예를 들어, 테스트에 필요한 불변 필드 초기화나 공통 객체 생성 시 생성자에서 처리하면 코드가 명확해지고, `@Before` 메서드보다 일관성 있는 초기화가 가능합니다.
---
Q3: 생성자와 @Before/@BeforeEach 어노테이션 사용의 차이는 무엇인가요?
A3:
- 생성자: 인스턴스 생성 시 1회 호출되어 필드 초기화에 적합합니다.
- `@Before` (JUnit 4) / `@BeforeEach` (JUnit 5): 인스턴스 생성 후 매 테스트 실행마다 호출되며, 초기화 로직뿐 아니라 상태가 변경되는 코드를 다시 셋업하는 데 적합합니다.
---
Q4: 어떤 상황에서 생성자 사용을 권장하나요?
A4:
- 불변 객체 초기화 및 기본 상태 설정
- 외부 자원에 의한 초기화가 필요 없거나 예외 처리가 복잡하지 않은 경우
그리고 테스트 프레임워크가 인스턴스를 매번 새로 생성한다는 점을 이해한 상태에서 사용해야 합니다.
---
Q5: 생성자에서 예외를 던질 수 있나요?
A5:
- JUnit 5에서는 생성자에서 예외를 선언하고 던질 수 있습니다.
- JUnit 4에서는 테스트 클래스 생성자가 checked 예외를 던지면 안 되며, 권장하지 않습니다.
따라서 예외가 발생할 가능성이 있다면 `@Before` 또는 `@BeforeEach`에서 처리하는 것이 안전합니다.
---
Q6: 생성자에서 의존성 주입(Dependency Injection)이 가능한가요?
A6:
- JUnit 5의 `@TestInstance(Lifecycle.PER_CLASS)`를 사용하면 한 클래스 인스턴스를 테스트 메서드들이 공유하므로 생성자에 파라미터를 넣는 커스텀 DI가 가능해집니다.
- 기본적으로 JUnit 4 및 JUnit 5는 파라미터 없는 기본 생성자를 사용합니다.
---
A7:
- 기본 JUnit 동작에서는 각 테스트마다 새로운 인스턴스를 생성하므로 생성자 내 상태 변화가 테스트 격리를 해치지 않습니다.
- 그러나 `PER_CLASS` 라이프사이클 사용 시 생성자가 한 번만 호출되어 인스턴스 필드 상태 공유에 유의해야 합니다.
---
Q8: 간단한 예제 코드를 보여주세요.
```java
public class MyTest {
private final List
// 생성자에서 초기화
public MyTest() {
list = new ArrayList<>();
list.add("initial");
}
@Test
public void testAdd() {
list.add("test");
assertEquals(2, list.size());
}
@Test
public void testEmpty() {
// 이 테스트는 새로운 인스턴스에서 실행되므로 list는 처음 상태
assertEquals(1, list.size());
}
}
```
---
정리:
- JUnit 테스트 클래스에서는 생성자를 활용하여 필드 초기화가 가능하며, 매 테스트마다 새 인스턴스가 생성되는 기본 동작 덕분에 대부분 테스트 격리에 문제 없습니다.
- 초기화 작업의 성격과 예외 처리 여부에 따라 생성자 또는 `@BeforeEach`를 적절히 선택해 사용하세요.
- JUnit 5의 라이프사이클 기능을 이용하면 생성자 활용도가 더 넓어집니다.
기본적으로 JUnit 4와 JUnit 5에서 테스트 클래스의 인스턴스 생성 방식과 생성자의 사용법은 조금 차이가 있습니다.
1. JUnit 4에서 생성자 사용법: - JUnit 4는 각 테스트 메서드를 실행할 때마다 테스트 클래스의 새로운 인스턴스를 생성합니다.
- 이 인스턴스는 기본 생성자를 통해 만들어지며, 별도의 생성자가 없으면 컴파일러가 기본 생성자를 만들어 줍니다.
- 직접 생성자를 정의할 수 있지만, 파라미터가 없는 기본 생성자여야 하며, 그 안에서 인스턴스 변수 초기화나 필드 설정을 할 수 있습니다.
- 그러나 이보다는 @Before 어노테이션을 사용한 초기화 메서드를 작성하는 것이 일반적입니다.
- 만약 생성자에 파라미터를 정의하면 JUnit 4는 테스트 클래스를 생성하지 못해 에러가 발생합니다.
- JUnit 4에서는 파라미터화된 테스트를 할 때는 @RunWith(Parameterized.class)와 함께 지정된 방식으로 인자를 넘겨 생성자를 통해 값을 초기화할 수 있습니다.
즉, 기본적으로 JUnit 4에서 생성자는 파라미터가 없는 기본 생성자를 두고, 그 안에서 필드 초기화가 가능하지만, @Before 메서드를 사용하는 편이 가장 권장됩니다.
2. JUnit 5에서 생성자 사용법: - JUnit 5 또한 기본적으로 각 테스트 메서드마다 새로운 테스트 인스턴스를 생성합니다.
- JUnit 5에서는 생성자에 파라미터를 받을 수 있습니다.
특히, JUnit Jupiter(
5)에서는 의존성 주입(Dependency Injection)을 지원하기 때문입니다.
- 예를 들어, TestInfo, TestReporter, RepetitionInfo와 같은 특정 타입을 생성자 파라미터로 받을 수 있습니다.
- 임의의 파라미터를 생성자에 정의할 수는 없으며, JUnit이 제공하는 몇몇 지원 객체들만 주입이 가능합니다.
- 생성자 안에서 필드 초기화나 필요한 설정을 할 수 있습니다.
- 파라미터화된 테스트(@ParameterizedTest)를 사용할 경우, 매개변수를 생성자에서 받는 대신, 테스트 메서드에 직접 파라미터를 전달하는 방식을 사용합니다.
결론적으로: - 테스트 클래스에서 일반적인 필드 초기화나 공통 설정은 생성자에서 할 수 있으나, 복잡한 초기화나 테스트마다 다른 설정이 필요하면 @BeforeEach(JUnit
5) 혹은 @Before(JUnit
4) 메서드를 사용하는 편이 가독성과 유지보수에 유리합니다.
- JUnit 4에서는 생성자에 파라미터를 넣으면 안 되고 기본 생성자를 사용해야 하며, 파라미터화된 테스트를 하려면 별도의 기법과 어노테이션을 써야 한다.
- JUnit 5에서는 생성자에 몇 가지 주요 JUnit 지원 타입의 파라미터를 받을 수 있다.
- 테스트 클래스 내에 생성자가 없으면 기본 생성자가 자동 생성되므로, 개발자가 직접 생성자를 작성하지 않아도 기본적인 테스트 실행에는 문제없다. 테스트 클래스의 생성자는 주로 객체 초기화 용도로 사용하며, JUnit의 실행 방식 특성상 대부분의 경우에 @Before 또는 @BeforeEach 메서드를 활용하는 것이 더 일반적이고 권장되는 패턴입니다.
그러나 JUnit 5에서는 제한적으로 생성자 파라미터 주입을 사용하는 것도 가능합니다.
작성자:
정민서 [비회원]
| 작성일자: 1년 전
2025-05-26 02:51:08
조회수: 152 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 152 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.