
xml에서 property를 통해 의존성을 주입하는 코드였는데 실행할 때는 문제가 없었지만 test코드를 실행하자 NullPointerExceptrion이 발생했다.
코드는 아래와 같았다.
public interface Tire {
String getBrand();
}
public class AmericaTire implements Tire {
public String getBrand() {
return "미국 타이어";
}
}
public class KoreaTire implements Tire {
public String getBrand() {
return "코리아 타이어";
}
}
public class Car {
Tire tire;
public Tire getTire() {
return tire;
}
public void setTire(Tire tire) {
this.tire = tire;
}
public String getTireBrand() {
return "장착한 타이어 : " + tire.getBrand();
}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Driver {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("expert003/expert003.xml");
Car car = context.getBean("car", Car.class);
System.out.println(car.getTireBrand());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- bean 태그를 이용해 상품을 등록 -->
<!-- id와 class를 통해 어떤 클래스를 통해 인스턴스화 해야 할지 나타냄 -->
<bean id="koreaTire" class="expert003.KoreaTire"></bean>
<bean id="americaTire" class="expert003.AmericaTire"></bean>
<bean id="car" class="expert003.Car">
<property name="tire" ref="koreaTire"></property>
</bean>
</beans>
서비스 부분 코드
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("expert003.xml")
class CarTest {
@Autowired
Car car;
@Test
public void 자동차_코리아타이어_장착_테스트() {
assertEquals("장착한 타이어 : 코리아 타이어", car.getTireBrand());
}
}
Test코드
코드를 다시 읽어봐도 오류는 없었다.
코드에서는 this.car이 null이라는데... 아예 객체가 생성되지 않았다는 것인데
인터넷을 찾아보니 어이없는 이유였다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("expert003.xml")
@SpringBootTest
class CarTest {
@Autowired
Car car;
@Test
public void 자동차_코리아타이어_장착_테스트() {
assertEquals("장착한 타이어 : 코리아 타이어", car.getTireBrand());
}
}
클래스 위에 @SpringBootTest를 어노테이션을 안했다고 오류가 발생했다.
테스트 코드는 단위 테스트와 같이 기능 검증을 위한 것이 아니라 spring framework에서 전체적으로 플로우가 제대로 동작하는지 검증하기 위해 사용 한다고 한다. 그래서 Spring Container가 돌아가지 않아서 @Autowired가 안된것이다.
어노테이션으로 명시하지 않으면 사용하고자 하는 Bean이 생성되지 않은 상태이므로 오류가 발생했던 것이다.
어노테이션(@) 까먹지 말고 사용하도록 하자.
'백엔드 공부 > Java' 카테고리의 다른 글
| [Java] ArrayList와 LinkedList (2) | 2023.12.27 |
|---|---|
| [Java] 자동 타입 변환 (4) | 2023.12.05 |
| [Java] static? (4) | 2023.11.27 |
| [Java] 열거 타입 (0) | 2023.11.24 |
| [Java] 향상된 for문 (2) | 2023.11.24 |