상품주문 테스트시 오류
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderServiceTest 실행 후 뜨는 오류입니다. package jpabook.jpashop.service ; import jpabook.jpashop.domain.Address ; import jpabook.jpashop.domain.Member ; import jpabook.jpashop.domain.Order ; import jpabook.jpashop.domain.OrderStatus ; import jpabook.jpashop.domain.item.Book ; import jpabook.jpashop.repository.OrderRepository ; import 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.junit4.SpringRunner ; import org.springframework.transaction.annotation. Transactional ; import javax.persistence.EntityManager ; import static org.junit.Assert.* ; import static org.junit.jupiter.api.Assertions.* ; @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 = new Member() ; member.setName( " 회원 1" ) ; member.setAddress( new Address( " 서울 " , " 강가 " , "123-123" )) ; em .persist(member) ; Book book= new Book() ; book.setName( " 시골 JPA" ) ; book.setPrice( 10000 ) ; book.setStockQuantity( 10 ) ; em .persist(book) ; int orderCount = 2 ; //when Long orderId = orderService .order(member.getId() , book.getId() , orderCount) ; //then Order getOrder = orderRepository .findOne(orderId) ; assertEquals (OrderStatus. ORDER , getOrder.getStatus() , " 상품 주문시 상태는 ORDER" ) ; } @Test public void 주문취소 () throws Exception{ //given //when //then } public void 상품주문 _ 재고수량초과 () throws Exception { //given //when //then } } 로 실행했을 때 밑에 오류가 뜹니다. 3월 17, 2022 5:48:54 오후 org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReasons$7 INFO: 0 containers and 1 tests were Method or class mismatch Failed to load ApplicationContext java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:138) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$8(ClassBasedTestDescriptor.java:363) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:368) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$9(ClassBasedTestDescriptor.java:363) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:362) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$6(ClassBasedTestDescriptor.java:283) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:282) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:272) at java.base/java.util.Optional.orElseGet(Optional.java:369) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:271) at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:102) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:101) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: jpabook.jpashop.repository.MemberRepository, at table: orders, for columns: [org.hibernate.mapping.Column(order_repository)] at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at app//org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at app//org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) at app//org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) at app//org.springframework.boot.SpringApplication.run(SpringApplication.java:303) at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:136) at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ... 85 more Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: jpabook.jpashop.repository.MemberRepository, at table: orders, for columns: [org.hibernate.mapping.Column(order_repository)] at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ... 100 more Caused by: org.hibernate.MappingException: Could not determine type for: jpabook.jpashop.repository.MemberRepository, at table: orders, for columns: [org.hibernate.mapping.Column(order_repository)] at app//org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:515) at app//org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:482) at app//org.hibernate.mapping.Property.isValid(Property.java:231) at app//org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:627) at app//org.hibernate.mapping.RootClass.validate(RootClass.java:267) at app//org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:359) at app//org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:314) at app//org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) at app//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498) at app//org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ... 104 more OrderServiceTest > 상품주문() FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1804 Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421 Caused by: org.hibernate.MappingException at SimpleValue.java:515 1 test completed, 1 failed > Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///Users/kimmin/Desktop/study/jpashop/build/reports/tests/test/index.html * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 14s 7 actionable tasks: 3 executed, 4 up-to-date 오류 문구로 추측해보았을 때 MemberResitory 클래스와 관련이 있는 것 같은데 무엇 때문인지 잘 모르겠습니다. MemberResitory 클래스입니다. package jpabook.jpashop.repository ; import jpabook.jpashop.domain.Member ; import lombok. RequiredArgsConstructor ; import org.springframework.stereotype. Repository ; import javax.persistence.EntityManager ; import java.util.List ; @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em ; public void save (Member member) { em .persist(member) ; } public Member findOne (Long id) { return em .find(Member. class, id) ; } public List<Member> findAll () { return em .createQuery( "select m from Member m" , Member. class ) .getResultList() ; } public List<Member> findByName (String name) { return em .createQuery( "select m from Member m where m.name = :name" , Member. class ) .setParameter( "name" , name) .getResultList() ; } } OrderResitory 클래스입니다 package jpabook.jpashop.repository ; import jpabook.jpashop.domain.Order ; import lombok. RequiredArgsConstructor ; import org.springframework.stereotype. Repository ; import javax.persistence.EntityManager ; import java.util.List ; @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) {} } OrderService 클래스입니다. 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 ; 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()) ; // 주문상품 생성 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(OderSearch orderSearch) { // return orderRepository.findAll(orderSearch); // } } Order 클래스입니다. package jpabook.jpashop.domain ; import jpabook.jpashop.repository.MemberRepository ; import jpabook.jpashop.repository.OrderRepository ; import lombok.AccessLevel ; import lombok. Getter ; import lombok. NoArgsConstructor ; import lombok. Setter ; import org.springframework.transaction.annotation. Transactional ; import javax.persistence.* ; import java.time.LocalDateTime ; import java.util.ArrayList ; import java.util.List ; import static javax.persistence.FetchType. LAZY ; @Entity @Table (name = "orders" ) @Getter @Setter @NoArgsConstructor (access = AccessLevel. PROTECTED ) public class Order { @Id @GeneratedValue @Column (name = "order_id" ) private Long id ; @ManyToOne (fetch = LAZY ) @JoinColumn (name = "member_id" ) private Member member ; @OneToMany (mappedBy = "order" , cascade = CascadeType. ALL ) private List<OrderItem> orderItems = new ArrayList<>() ; @OneToOne (fetch = LAZY , cascade = CascadeType. ALL ) @JoinColumn (name = "delivery_id" ) private Delivery delivery ; private LocalDateTime orderDate ; // 주문시간 @Enumerated (EnumType. STRING ) private OrderStatus status ; // 주문 상태 : [ORDER, CANCEL] private MemberRepository orderRepository ; // 연관관계 메서드 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 = 0 ; for (OrderItem orderItem : orderItems ) { totalPrice += orderItem.getTotalPrice() ; } return totalPrice ; } }
- spring-boot
- JPA
- java
- 웹앱
- spring





