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

고도윤님의 프로필 이미지

작성한 질문수

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

JPA와 DB 설정, 동작확인

JUnir4, JUni5

작성

·

1.8K

1

지금 코드에서 오류가 발생하는데 해결방법을 몰라서 글 남기게 되었습니다.

 

스크린샷 2024-04-04 오후 7.27.05.png스크린샷 2024-04-04 오후 7.27.22.png스크린샷 2024-04-04 오후 7.27.26.png스크린샷 2024-04-04 오후 7.27.35.png저는 테스트코드 만들때 JUnit 5 로 했는데, 강사님은 4로 하신거 같은데 그래서 발생하는 오류인가요? 아니면 처음부터 그냥 JUnit 4 로 테스트 코드 작성해야 하나요?

답변 5

3

안녕하세요, 인프런 AI 인턴입니다.

고도윤님의 질문에 답변 드립니다. 현재 발생하신 문제는 JUnit 버전에 따른 호환성 문제로 추정됩니다. 강의 중 JUnit4를 사용하셨다면, 코드에 사용된 어노테이션이나 특정 기능이 JUnit5에서 다르게 작동할 수 있습니다. 이 경우 테스트 코드 실행 시 에러가 발생할 수 있습니다.

JUnit5를 사용하고 계시면 @RunWith(SpringRunner.class) 어노테이션 대신 @ExtendWith(SpringExtension.class)을 사용해야 합니다. 또한, build.gradle 파일에 JUnit5 관련 설정이 올바르게 되어 있는지 확인해야 합니다. JUnit5를 사용할 경우, testImplementation 'org.junit.jupiter:junit-jupiter-api:5.x.x'와 같은 의존성이 포함되어 있어야 하고, JUnit4의 경우 testImplementation 'junit:junit:4.x.x'가 필요합니다.

이전 수강생들이 직면했던 유사한 문제와 해결책을 담고 있는 관련 링크입니다:
- MemberRepositoryTest 실행시 오류에서는 JUnit 버전 차이로 인한 실행 문제에 관한 질문과 답변을 확인하실 수 있습니다.

특히, 다음 링크에 있는 답변이 도움이 될 수 있습니다:
- 김영한 강사님께서 제공하신 MemberRepositoryTest 실행시 오류 해결 방법에서는 @RunWith(SpringRunner.class)@ExtendWith(SpringExtension.class)로 변경하는 것이 언급되었습니다.

JUnit 버전에 대한 변경 사항을 적용하고 나서도 문제가 지속된다면, IDEA의 Gradle 설정 확인, 프로젝트의 Clean & Rebuild, IntelliJ IDEA의 캐시 및 재시작 같은 추가적인 해결 방법을 시도해 볼 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

저도 같은오류인데 미치겠네요..ㅠㅠ

문제가 발생하는 상황을 정리하여 질문 글을 등록하시면 영한님과 서포터즈, AI인턴이 도움드리겠습니다 😀

0

고도윤님의 프로필 이미지
고도윤
질문자

지금 build.gradle 에 의존성을 추가해도 안되는데 진짜 왜이러는건가요?

// JUnit 5 의존성 추가 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'

 

 

출력로그

 

> Task :compileJava UP-TO-DATE

> Task :processResources UP-TO-DATE

> Task :classes UP-TO-DATE

> Task :compileTestJava UP-TO-DATE

> Task :processTestResources NO-SOURCE

> Task :testClasses UP-TO-DATE

19:55:33.532 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [jpabook.jpashop.MemberRepositoryTest]: MemberRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.

19:55:33.609 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration jpabook.jpashop.JpashopApplication for test class jpabook.jpashop.MemberRepositoryTest

java.lang.NoSuchMethodError: 'org.junit.jupiter.api.extension.ExecutableInvoker org.junit.jupiter.api.extension.ExtensionContext.getExecutableInvoker()'

at org.springframework.test.context.junit.jupiter.SpringExtension.registerMethodInvoker(SpringExtension.java:381)

at org.springframework.test.context.junit.jupiter.SpringExtension.beforeAll(SpringExtension.java:132)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllCallbacks$8(ClassBasedTestDescriptor.java:368)

at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllCallbacks(ClassBasedTestDescriptor.java:368)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:192)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:78)

at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:148)

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:1596)

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:107)

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:114)

at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)

at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)

at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:119)

at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:94)

at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:89)

at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62)

at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)

at java.base/java.lang.reflect.Method.invoke(Method.java:580)

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 jdk.proxy1/jdk.proxy1.$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:113)

at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)

at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)

at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

Suppressed: java.lang.NoSuchMethodError: 'org.junit.jupiter.api.extension.ExecutableInvoker org.junit.jupiter.api.extension.ExtensionContext.getExecutableInvoker()'

at org.springframework.test.context.junit.jupiter.SpringExtension.registerMethodInvoker(SpringExtension.java:381)

at org.springframework.test.context.junit.jupiter.SpringExtension.afterAll(SpringExtension.java:143)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$14(ClassBasedTestDescriptor.java:434)

at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeAfterAllCallbacks$15(ClassBasedTestDescriptor.java:434)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeAfterAllCallbacks(ClassBasedTestDescriptor.java:434)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:216)

at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.after(ClassBasedTestDescriptor.java:78)

at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:161)

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:161)

... 46 more

> Task :test FAILED

MemberRepositoryTest > initializationError FAILED

java.lang.NoSuchMethodError at SpringExtension.java:381

1 test completed, 1 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/a0000/Documents/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8%EC%99%80%20JPA%ED%99%9C%EC%9A%A91%20-%20%EC%9B%B9%20%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%20%EA%B0%9C%EB%B0%9C/jpashop/build/reports/tests/test/index.html

* Try:

> Run with --scan to get full insights.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.7/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD FAILED in 1s

4 actionable tasks: 1 executed, 3 up-to-date

 

메뉴얼의 내용을 확인해주세요.

확인해보시고 안될 경우 댓글 남겨주세요.

해결이 안된다면 프로젝트 코드를 요청드리고 확인해봐야 알 것 같습니다.

image

build.gradle 수정

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}
group = 'jpabook'
version = '0.0.1-SNAPSHOT'
java {
    sourceCompatibility = '17'
}
configurations {
    compileOnly {
       extendsFrom annotationProcessor
    }
}
repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test' //JUnit4 추가 testImplementation("org.junit.vintage:junit-vintage-engine") {
    exclude group: "org.hamcrest", module: "hamcrest-core"
}

tasks.named('test') {
    useJUnitPlatform()
}

 

아이콘 클릭

image

강의 수강 중 도움이 필요하시면 언제든 질문 남겨주세요 ^^

0

안녕하세요. 고도윤님, 공식 서포터즈 OMG입니다.

질문과 댓글의 내용을 보았을 때 build.gradle의 아래 설정이 적용되어 있지 않은 것 같습니다.

적용해보시고, 해결이 안될 경우 댓글 남겨주세요.

image

감사합니다.

고도윤님의 프로필 이미지
고도윤
질문자

말씀하신대로 했는데도 안됩니다.

imageimage

프로젝트 코드를 확인해봐야 알 것 같습니다.

 

실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

고도윤님의 프로필 이미지
고도윤
질문자

한번봐주세요ㅜㅜ

 

image

액세스 접근 권한 요청 화면이 출력되지 않도록 자주하는 질문을 참고하여 링크있는 사용자에게 권한을 적용해주세요 😀

네, 확인되었고 처음에는 오류가 발생하였는데 테스트 성공하여 해결한 방법을 전달드릴게요.

 

(1) DB 삭제 및 재생성

터미널을 열고, 다음 2개의 명령어를 각각 실행해주세요.

rm -rf jpashop.mv.db

touch jpashop.mv.db

 

(2) application.yml 오타 수정 및 설정 변경

변경 전(Spring 대문자 S를 소문자 s로, MVCC=TRUEE 제거)

Spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop;MVCC=TRUE
    username: sa
    password:
    driver-class-name: org.h2.Driver

변경 후

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

 

(3)"중요" h2 버전은 2.2.214 혹은 2.2.224 로 설치 및 실행중인 상태여야함.

image위의 상황을 만족하면 테스트는 성공할거에요. 시도해보시고 문제가 발생하면 댓글 남겨주세요

고도윤님의 프로필 이미지
고도윤
질문자

ㅜㅜ 드디어 성공했습니다... 감사합니다............!

 

0

고도윤님의 프로필 이미지
고도윤
질문자

현재 지금 강의파일에 올려주신대로 JUnit4 로 해서 테스트코드를 작성한 결과도 다음과 같습니다.

 

package jpabook.jpashop;


import jakarta.transaction.Transactional;
import org.assertj.core.api.Assertions;
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.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {
    @Autowired
    MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(false)
    public void testMember() {
        Member member = new Member();
        member.setUsername("memberA");
        Long savedId = memberRepository.save(member);
        Member findMember = memberRepository.find(savedId);
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());

        Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장

    }
}

출력로그는
> Task :compileJava UP-TO-DATE

> Task :processResources UP-TO-DATE

> Task :classes UP-TO-DATE

> Task :compileTestJava FAILED

/Users/a0000/Documents/스프링부트와 JPA활용1 - 웹 어플리케이션 개발/jpashop/src/test/java/jpabook/jpashop/MemberRepositoryTest.java:6: error: cannot find symbol

import org.junit.Test;

^

symbol: class Test

location: package org.junit

/Users/a0000/Documents/스프링부트와 JPA활용1 - 웹 어플리케이션 개발/jpashop/src/test/java/jpabook/jpashop/MemberRepositoryTest.java:7: error: package org.junit.runner does not exist

import org.junit.runner.RunWith;

^

/Users/a0000/Documents/스프링부트와 JPA활용1 - 웹 어플리케이션 개발/jpashop/src/test/java/jpabook/jpashop/MemberRepositoryTest.java:13: error: cannot find symbol

@RunWith(SpringRunner.class)

^

symbol: class RunWith

/Users/a0000/Documents/스프링부트와 JPA활용1 - 웹 어플리케이션 개발/jpashop/src/test/java/jpabook/jpashop/MemberRepositoryTest.java:19: error: cannot find symbol

@Test

^

symbol: class Test

location: class MemberRepositoryTest

4 errors

FAILURE: Build failed with an exception.

* What went wrong:

Execution failed for task ':compileTestJava'.

> Compilation failed; see the compiler error output for details.

* Try:

> Run with --info option to get more log output.

> Run with --scan to get full insights.

BUILD FAILED in 1s

3 actionable tasks: 1 executed, 2 up-to-date

이런게 나옵니다....