강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

installjung님의 프로필 이미지
installjung

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 기능 테스트

new Address(

작성

·

440

0

게시판 찾아보았을때 저와 같은 오류가 있길래 저도 아파치 import인것 같아 제 address를 추가해도 

빨간줄이 사라지지 않습니다.. 무슨 문제인지 알려주시면 감사하겠습니다. 

 

 

퀴즈

What is the main business logic that occurs when an order is cancelled?

Order status changes to 'Shipping'.

Stock of ordered items is decreasing.

Stock of canceled order items is restored.

Even delivered orders can be freely cancelled.

답변 3

1

안녕하세요 같은 오류였는데 해결이 된 듯하여 글 남깁니다!

Address 클래스에 기본생성자를 public으로 만들어보세요 저는 그렇게 해결되었습니다!

1

저도 같은 에러인데 해결이 안되서 질문드립니다..

Address Class 는 아래와 같습니다.

package jpabook.jpashop.domain;

import lombok.Getter;

import javax.persistence.Embeddable;

@Embeddable
@Getter
public class Address {

private String city;
private String street;
private String zipcode;

protected Address() {
}

public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}

하지만 OrderService Class에 // 배송정보 생성 부분에서 에러가 났고

package jpabook.jpashop.service;
import jpabook.jpashop.domain.Delivery;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderItem;
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;

@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()); // 에러 부분

// 주문상품 생성
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();
}
}
 

OrderServiceTest에서도 new Address부분이 에러가 뜹니다...

package jpabook.jpashop.service;



import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.Order;
import jpabook.jpashop.domain.OrderStatus;
import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.exception.NotEnoughStockException;
import jpabook.jpashop.repository.OrderRepository;
import org.apache.tomcat.jni.Address;
import org.junit.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.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;

import static org.junit.Assert.*;


@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class OrderServiceTest {

@Autowired EntityManager em;
@Autowired OrderService orderService;
@Autowired OrderRepository orderRepository;

@Test
public void 상품주문() throws Exception {
// given
Member member = createMember();

Book book = createBook("시골 JPA", 10000, 10);

int orderCount = 2;
// when
Long orderId = orderService.order(member.getId(), book.getId(), orderCount);

// then
Order getOrder = orderRepository.findOne(orderId);

assertEquals("상품 주문시 상태는 ORDER", OrderStatus.ORDER, getOrder.getStatus());
assertEquals("주문한 상품 종류 수가 정확해야 한다.", 1, getOrder.getOrderItems().size());
assertEquals("주문 가격은 가격 * 수량이다.", 10000 * orderCount, getOrder.getTotalPrice());
assertEquals("주문 수량만큼 재고가 줄어야 한다.", 8, book.getStockQuantity());

}

@Test(expected = NotEnoughStockException.class)
public void 상품주문_재고수량초과() throws Exception {
// given
Member member = createMember();
Item item = createBook("시골 JPA", 10000, 10);

int orderCount = 11;


// when
orderService.order(member.getId(), item.getId(), orderCount);

// then
fail("재고 수량 부족 예외가 발생해야 한다.");
}

@Test
public void 주문취소() throws Exception {
// given
Member member = createMember();
Book item = createBook("시골 JPA", 10000, 10);

int orderCount = 2;

Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
// when
orderService.cancelOrder(orderId);

// then
Order getOrder = orderRepository.findOne(orderId);

assertEquals("주문 취소시 상태는 CANCEL 이다.", OrderStatus.CANCEL, getOrder.getStatus());
assertEquals("주문이 취소된 상품은 그만큼 재고가 증가해야 한다.", 10, item.getStockQuantity());
}

private Book createBook(String name, int price, int stockQuantity) {
Book book = new Book();
book.setName(name);
book.setPrice(price);
book.setStockQuantity(stockQuantity);
em.persist(book);
return book;
}

private Member createMember() {
Member member = new Member();
member.setName("회원1");

// 아래 new Address 부분 에러
member.setAddress(new Address("서울", "강가", "123-123")); // 에러로그
em.persist(member);
return member;
}


}
 

run 할시 에러로그가 아래와 같이 뜹니다.,

java: incompatible types: org.apache.tomcat.jni.Address cannot be converted to jpabook.jpashop.domain.Address

 

installjung님 해결하셨나요??,,, 

어떤 문제인지 알려주시면 감사하겠습니다.

0

안녕하세요, installjung 님. 공식 서포터즈 codesweaver 입니다.
.
Address 클래스 파일에 생성자가 있는지 확인해주세요.

public Address(String, String, String) { ... } 형태의 생성자가 있어야 합니다.
.
감사합니다.

installjung님의 프로필 이미지
installjung

작성한 질문수

질문하기