OrderServiceTest 코드의 NullPointerException
1693
작성한 질문수 4
[질문 내용]
(구글 드라이브에 업로드한 전체 프로젝트 링크 : https://drive.google.com/file/d/1rHbKUDz6JSdGbSuCNprE86n8_K0tP0Ls/view?usp=sharing)
OrderService 코드를 테스트 하기 위해 OrderServiceTest 파일을 만든 후, 해당 파일 아래에 상품주문 테스트 코드를 작성하여 실행했습니다
그 결과 다음과 같은 오류가 발생합니다
java.lang.NullPointerException: Cannot invoke "jpabook.jpashop.service.OrderService.order(java.lang.Long, java.lang.Long, int)" because "this.orderService" is null아래의 Order, OrderRepository, OrderService 코드 모두 강사님의 코드와 비교해보았으나 딱히 다른점을 찾지 못했습니다. 왜 이런 일이 일어날까요?
OrderService 코드
package jpabook.jpashop.service;
import jpabook.jpashop.domain.*;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.repository.ItemRepository;
import jpabook.jpashop.repository.MemberRepository;
import jpabook.jpashop.repository.OrderRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final MemberRepository memberRepository;
private final ItemRepository itemRepository;
//주문
@Transactional
public Long order(Long memberId, Long itemId, int count) {
//엔티티 조회
Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOne(itemId);
//배송정보 생성
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
delivery.setStatus(DeliveryStatus.READY);
//주문상품 생성
OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);
//주문 생성
Order order = Order.createOrder(member, delivery, orderItem);
//주문 저장
orderRepository.save(order);
return order.getId();
}
//주문취소
// @Transactional
// public void cancelOrder(Long orderId) {
// //엔티티 조회
// Order order = orderRepository.findOne(orderId);
// //주문 취소
// order.cancel();
//
// }
//검색
// public List<Order> findOrders(OrderSwarch orderSwarch) {
// return orderRepository.findall(orderSwarch);
// }
}
OrderRepository 코드
package jpabook.jpashop.repository;
import jpabook.jpashop.domain.Order;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
@Repository
@RequiredArgsConstructor
public class OrderRepository {
private final EntityManager em;
public void save(Order order) {
em.persist(order);
}
public Order findOne(Long id) {
return em.find(Order.class, id);
}
// public List<Order> findAll(OrderSearch orderSearch) {
//
// }
}
Order 코드
package jpabook.jpashop.domain;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "orders")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Order {
@Id @GeneratedValue
@Column(name="order_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="member_id")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="delivery_id")
private Delivery delivery;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status; //주문상태 [ORDER, CANCEL]
//연관관계 먀서드//
public void setMember(Member member){
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}
//생성 매서드//
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for (OrderItem orderItem : orderItems) {
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}
//비지니스 로직
/*
주문 취소
*/
public void cancel() {
if (delivery.getStatus() == DeliveryStatus.COMP) {
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다");
}
this.setStatus(OrderStatus.CANCEL);
for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}
}
//조회 로직
/**
*
* 전체 주문가격 조회
*/
public int getTotalPrice() {
int totalPrice = orderItems.stream().mapToInt(OrderItem::getTotalPrice).sum();
return totalPrice;
}
}
OrderServiceTest 코드
package jpabook.jpashop.service;
import jpabook.jpashop.domain.*;
import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.repository.OrderRepository;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
@SpringBootTest
@Transactional
public class OrderServiceTest {
@Autowired EntityManager em;
@Autowired OrderService orderService;
@Autowired OrderRepository orderRepository;
@Test
public void 상품주문() throws Exception{
// given
Member member = new Member();
member.setName("member1");
member.setAddress(new Address("seoul", "river", "934=134"));
Book book = new Book();
book.setName("pricnciple");
book.setPrice(1000);
book.setStockQuantity(10);
int orderCount = 2;
// when
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);
// then
Order getOrder = orderRepository.findOne(orderId);
Assert.assertEquals("상품 주문시 상태는 order", OrderStatus.ORDER, getOrder.getStatus() );
}
}
에러 메시지

java.lang.NullPointerException: Cannot invoke "jpabook.jpashop.service.OrderService.order(java.lang.Long, java.lang.Long, int)" because "this.orderService" is null
at jpabook.jpashop.service.OrderServiceTest.상품주문(OrderServiceTest.java:50)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
답변 1
1
안녕하세요. changsik choi님, 공식 서포터즈 OMG입니다.
.

import org.junit.Test; 를 아래 코드로 바꿔주세요
import org.junit.jupiter.api.Test;코드를 수정하면 다른 에러가 발생하는데요
id to load is required for loading
아래 링크와 강의 영상을 참고하여 코드를 수정해주세요
https://www.inflearn.com/questions/130507
https://www.inflearn.com/questions/65714
.
감사합니다.
안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..
0
26
2
OrderServiceTest 상문주문 테스트 시 update 쿼리 문의
0
42
1
sdk 설정 오류
0
85
2
오탈자 - @Transactional
0
79
1
src/test/resources 테스트 경로 문제
0
76
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
74
1
MemberRepositoryTest 실행오류
0
101
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
206
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
163
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
61
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
91
1
기본 생성자
0
71
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
111
1
멤버서비스테스트 부분에서 막힙니다.
0
190
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
134
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
135
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
126
1
24분 27초 연관관계 편의 메서드 위치
0
122
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
120
2
빌드 툴, Gradle
0
75
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
86
2
Repository에서 EntityManager 주입 방식 차이
0
100
1
롬복과 사용자 정의 setter 메서드
0
80
1
주문 목록 조회 fetch join 질문드립니다
0
94
1





