programing

java.displaces를 클릭합니다.예외:JUnit 실행에 실행 가능한 메서드 예외가 없습니다.

projobs 2022. 10. 11. 21:52
반응형

java.displaces를 클릭합니다.예외:JUnit 실행에 실행 가능한 메서드 예외가 없습니다.

./opt/junit/JAR( 및 합니다.

java -cp hamcrest-core-1.3.jar:junit.jar:. org.junit.runner.JUnitCore  TestRunner

TestJunit 클래스:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
   @Test
   public void testAdd() {
      String str= "Junit is working fine";
      assertEquals("Junit is working fine",str);
   }
}

Test Runner:

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(TestJunit.class);
      for (Failure failure : result.getFailures()) {
         System.out.println("fail ho gaya"+failure.toString());
      }
      System.out.println("passed:"+result.wasSuccessful());
   }
}  

이 실행에서 다음과 같은 예외가 발생합니다.

JUnit version 4.11
.E
Time: 0.003
There was 1 failure:
1) initializationError(TestRunner)
java.lang.Exception: No runnable methods
    at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:169)
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:104)
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runner.Computer.getRunner(Computer.java:40)
    at org.junit.runner.Computer$1.runnerForClass(Computer.java:31)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87)
    at org.junit.runners.Suite.<init>(Suite.java:80)
    at org.junit.runner.Computer.getSuite(Computer.java:28)
    at org.junit.runner.Request.classes(Request.java:75)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:117)
    at org.junit.runner.JUnitCore.runMain(JUnitCore.java:96)
    at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
    at org.junit.runner.JUnitCore.main(JUnitCore.java:40)

FAILURES!!!
Tests run: 1,  Failures: 1

예외는 JUnit 4.4 코어 러너를 사용하여 다음을 포함하지 않는 클래스를 실행하는 경우 발생합니다."@Test" method자세한 내용은 링크를 참조하십시오.

customy vipin8169

제 경우 잘못된 패키지를 Import했습니다.

import org.testng.annotations.Test;

대신

import org.junit.Test;

당신의 이데올로기 자동완성에 주의하세요.

컨트롤러 테스트는 큰 숏컷으로 실시합니다.

@RunWith(SpringRunner.class)
@SpringBootTest
public class TaskControllerTest {
   //...
   //tests
   //
}

방금 '공공'을 없앴더니 마법처럼 작동했어요

이 솔루션은 매우 적은 비율의 사람들에게 적용됩니다.일반적으로 JUnit 테스트 주자를 구현하고 별도의 ClassLoader를 사용하는 사람들입니다.

이 문제는 다른 ClassLoader에서 클래스를 로드한 후 시스템클래스 로더에서 로드된 JUnitCore 인스턴스에서 해당 테스트를 실행하려고 할 때 발생할 수 있습니다.예:

// Load class
URLClassLoader cl = new URLClassLoader(myTestUrls, null);
Class<?>[] testCls = cl.loadClass("com.gubby.MyTest");

// Run test
JUnitCore junit = new JUnitCore();
junit.run(testCls); // Throws java.lang.Exception: No runnable methods

스택 트레이스 보기:

java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:169)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:104)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
at org.junit.runner.JUnitCore.run(JUnitCore.java:138)

문제는 실제로 블록에서 발생합니다.JUnit4ClassRunner: 169(JUnit 4.11로 가정):

https://github.com/junit-team/junit/blob/r4.11/src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java#L95

합니다.@Test:

protected List<FrameworkMethod> computeTestMethods() {
    return getTestClass().getAnnotatedMethods(Test.class);
}

「」는,Test.class시스템 ClassLoader(즉, JUnitCore를 로드한 방법)가 로딩되어 있기 때문에 기술적으로 어떤 테스트 메서드에도 해당 주석이 주석을 달지 않습니다.

해결책은 테스트 자체와 동일한 ClassLoader에 JUnitCore를 로드하는 것입니다.


편집: 사용자 3486675의 질문에 대한 답변으로 시스템 클래스 로더에 위임되지 않은 ClassLoader를 작성해야 합니다.다음은 예를 제시하겠습니다.

private static final class IsolatedURLClassLoader extends URLClassLoader {
    private IsolatedURLClassLoader(URL[] urls) {
        // Prevent delegation to the system class loader.
        super(urls, null);
    }
}

필요한 모든 것을 포함한 URL 세트를 전달합니다.시스템 클래스 경로를 필터링하여 생성할 수 있습니다.이러한 클래스는 테스트클래스의 ClassLoader가 아닌 부모ClassLoader에 의해 로드되기 때문에 단순히 부모ClassLoader에 위임할 수 없습니다.

그런 다음 이 ClassLoader에 의해 로드된 클래스에서 JUnit 작업 전체를 시작해야 합니다.여기가 좀 지저분해지네요.아래에는 이런 완전 쓰레기 같은 것이 있다.

public static final class ClassLoaderIsolatedTestRunner {

    public ClassLoaderIsolatedTestRunner() {
        // Disallow construction at all from wrong ClassLoader
        ensureLoadedInIsolatedClassLoader(this);
    }

    // Do not rename.
    public void run_invokedReflectively(List<String> testClasses) throws BuildException {
        // Make sure we are not accidentally working in the system CL
        ensureLoadedInIsolatedClassLoader(this);

        // Load classes
        Class<?>[] classes = new Class<?>[testClasses.size()];
        for (int i=0; i<testClasses.size(); i++) {
            String test = testClasses.get(i);
            try {
                classes[i] = Class.forName(test);
            } catch (ClassNotFoundException e) {
                String msg = "Unable to find class file for test ["+test+"]. Make sure all " +
                        "tests sources are either included in this test target via a 'src' " +
                        "declaration.";
                throw new BuildException(msg, e);
            }
        }

        // Run
        JUnitCore junit = new JUnitCore();
        ensureLoadedInIsolatedClassLoader(junit);
        junit.addListener(...);
        junit.run(classes);
    }

    private static void ensureLoadedInIsolatedClassLoader(Object o) {
        String objectClassLoader = o.getClass().getClassLoader().getClass().getName();

        // NB: Can't do instanceof here because they are not instances of each other.
        if (!objectClassLoader.equals(IsolatedURLClassLoader.class.getName())) {
            throw new IllegalStateException(String.format(
                    "Instance of %s not loaded by a IsolatedURLClassLoader (loaded by %s)",
                    cls, objectClassLoader));
        }
    }
}

그런 다음 반사를 통해 주자를 호출해야 합니다.

Class<?> runnerClass = isolatedClassLoader.loadClass(ClassLoaderIsolatedTestRunner.class.getName());

// Invoke via reflection (List.class is OK because it just uses the string form of it)
Object runner = runnerClass.newInstance();
Method method = runner.getClass().getMethod("run_invokedReflectively", List.class);
method.invoke(...);

수입 명세서를 변경해야 했습니다.

import org.junit.jupiter.api.Test;

로.

import org.junit.Test;

이치노은 스프링 으로, 「 」가 원인입니다.@RunWith사용한 적이 있습니다.

@RunWith(SpringRunner.class)

이 주석으로 JUnit Vintage가 실행 중인데 테스트를 찾을 수 없고 오류가 발생합니다.나는 그것을 제거했고 JUnit Jupiter만 작동하며 모든 것이 정상입니다.

에는 잘못 요.Test★★★★★★★★★★★★★★★★★★★★★★★★★★.import org.junit.Test;

import org.junit을 사용하는 경우.jupiter.api를 클릭합니다.테스트(Junit 5)와 @RunWith(SpringRunner.class), SpringRunner가 Junit 4에 있으면 Junit이 혼란스러워집니다.Junit 5가 공개 테스트 클래스에 대해 불만을 표시하므로 클래스 이름 전에 공개를 삭제하는 것이 효과적입니다.문서에서: JUnit5는 모든 것을 공개해야 했던 JUnit4보다 테스트 클래스의 가시성에 대해 더 관대합니다.이 경우 JUnit5 테스트클래스는 가시성을 가질 수 있지만 프라이빗 패키지에서는 기본 패키지 가시성을 사용하는 것이 좋습니다.이것에 의해, 코드의 가독성이 향상됩니다.

내 경우 방금 //@RunWith(SpringRunner.class)를 비활성화했습니다.

예외는 없다

저는 교환을 하고 있습니다.import org.junit.jupiter.api.Test;import org.junit.Test;도움이 되었습니다.

저도 이 문제에 직면해서 같은 이유를 알 수 없었습니다.나중에 IDE를 사용한 자동 Import 문제를 발견했습니다.그것은 프로그램의 수입품입니다.

기본적으로 저는 이클립스 IDE를 사용하고 있었습니다. 제가 잘못된 ."org.junit.jupiter.api.Test" 대신 "org.junit.Test".따라서 프로그램을 실행하기 전에 가져오기를 확인하십시오.

이것도 org를 섞으면 나올 수 있어요.junit과 org.junit.주피터 주석이 잘못 표시됩니다.

Jupiter ( 5 ) Junit Jupiter ( Junit 5 )와 Junit ( Junit 5 )를 하였습니다. JUnitCore.runClasses(classes);@RunWith(SpringRunner.class)...
달리다@SpringBootTest @FixMethodOrder(MethodSorters.NAME_ASCENDING)위의 코멘트에 기재된 바와 같이, 테스트의 문제를 해결할 수 있습니다.https://stackoverflow.com/a/59563970/13542839

자체 테스트 스위트를 올바르게 생성하지 않았기 때문에 다음 오류가 발생했습니다.

올바른 방법은 다음과 같습니다.

을 ★★★★★★★★★★★★★★★에 넣어 주세요.Foobar.java:

public class Foobar{
    public int getfifteen(){
        return 15;
    }
}

을 ★★★★★★★★★★★★★★★에 넣어 주세요.FoobarTest.java:

import static org.junit.Assert.*;
import junit.framework.JUnit4TestAdapter;
import org.junit.Test;
public class FoobarTest {
    @Test
    public void mytest() {
        Foobar f = new Foobar();

        assert(15==f.getfifteen());
    }
    public static junit.framework.Test suite(){
       return new JUnit4TestAdapter(FoobarTest.class);
    }
}

.junit4-4.8.2.jar여기 있는 걸 썼어

http://www.java2s.com/Code/Jar/j/Downloadjunit4jar.htm

컴파일:

javac -cp .:./libs/junit4-4.8.2.jar Foobar.java FoobarTest.java

실행:

el@failbox /home/el $ java -cp .:./libs/* org.junit.runner.JUnitCore FoobarTest
JUnit version 4.8.2
.
Time: 0.009    
OK (1 test)

1개 테스트 통과.

하고 있는 「」를 참조해 주세요.@RunWith(Suite.class) @Suite.SuiteClasses({})제공된 모든 클래스가 실제로 테스트 클래스인지 확인합니다.

제 경우 수업 중 하나는 테스트 수업이 아닌 실제 구현이었습니다.그냥 바보 같은 오타야.

클래스에서 @RunWith(SpringRunner.class)에 주석을 달았지만 테스트 방법이 포함되어 있지 않은 경우 이 문제에 직면합니다.해결책: 추상화하면 얻을 수 없거나 공개를 삭제하면 이 문제에 직면하지 않습니다.

에서는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★New > Other > JUnit > Junit TestJUnit 3.x를 사용했기 때문인지 동일한 텍스트로 작성된 Java 클래스에서 오류가 발생했습니다.

가장 간단한 해결책은 초기화 예외가 있는 클래스에 @Test 주석 메서드를 추가하는 것입니다.

저희 프로젝트에는 초기 설정의 메인 클래스가 있습니다.@Test 메서드를 추가했는데 예외가 사라졌습니다.

프로젝트 클래스 패스에 junit jar를 수동으로 추가하여 수정할 수 있었습니다.가장 쉬운 방법은 프로젝트 루트에 /lib 디렉토리를 추가하는 것입니다.그리고 junit.jar를 /lib에 넣기만 하면 junit 테스트가 작동하기 시작합니다.

@RunWith(SpringRunner.class)에 주석을 달고 다른 testClass에 의해 확장되고 있는 부모 테스트 setUp 클래스에서도 같은 상황에 직면했습니다.setUpclass에는 테스트가 없고 Junit은 주석 @RunWith(SpringRunner.class)로 인해 테스트를 검색하려고 했지만 찾지 못하고 예외가 발생하였습니다.

No runnable methods exception in running JUnits

나는 부모님 수업을 추상적으로 만들었고 그것은 매력적으로 작용했다.

https://stackoverflow.com/a/10699141/8029525 에서 도움을 받았습니다.@froh42 도와줘서 고마워요.

를 Import 하면, 솔루션은 간단합니다.

import org.junit.Test;

너는 Junit 4로 뛰어야 한다.

오른쪽 클릭 -> 실행 as-> 테스트 설정 -> 테스트 러너 -> 를 junit 4 로 합니다.

저는 이렇게 덧붙인다.JUnit4.12 ★★★★★★★★★★★★★★★★★」Hamcrest1.3import org.testng.annotations.Test; ★★★★★★★★★★★★★★★★★」import org.testng.annotations.*;로로 합니다.import org.junit.Test;★★★★★★★★★★★★★★★★★★★!

경험상으로는 스프링 부츠 프로젝트를 진행하고 있는데 JUnit Vintage와 함께 JUnit Jupiter 테스트를 받고 있었습니다.JUnit Vintage는 실패하여 퍼블릭 액세스 수식어를 삭제하자 Junit Vintage 테스트가 사라졌고 결과적으로 원하는 동작을 달성했습니다.

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"test"})
public class TestSuiteName {

||

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"test"})
class TestSuiteName {

인텔리J에서 Test Case를 실행할 때 JUnit Zupiter와 JUnit Vintage가 분리된 이유는 무엇입니까?

있다면 pom.xml에서 꺼내세요.

       <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>

이 test-case-method에 액세스 수식 public을 추가하지 않은 경우에도 같은 오류가 발생하였습니다.JUnit 4를 썼어요.Junit 5의 경우 test-case-method에 대한 액세스 지정자를 사용하지 않고 동일한 테스트케이스가 동작합니다.

이것을 Junit5에서 실행해 보았습니다.

@SpringBootTest(classes = {ServletWebServerFactoryAutoConfiguration.class},
        webEnvironment = RANDOM_PORT,
        properties = {"spring.cloud.config.enabled=false"})
@ExtendWith(MockitoExtension.class)
@AutoConfigureMockMvc

언급URL : https://stackoverflow.com/questions/24319697/java-lang-exception-no-runnable-methods-exception-in-running-junits

반응형