मैं अभी अपने एंड्रॉइड स्टूडियो को नवीनतम में अपग्रेड करता हूं। और वर्तमान में मुझे लगता है कि मेरे कुछ परीक्षण वर्ग परतदार परीक्षा परिणाम उत्पन्न कर रहे हैं और मैं एंड्रॉइड स्टूडियो में रिपीट मोड चलाना चाहता हूं जैसा कि मैंने एंड्रॉइड स्टूडियो 4.2 में किया था। लेकिन मैंने पाया कि मुझे निम्नलिखित अपवाद मिला है:

यहां तक ​​​​कि मैंने एक साधारण टेस्ट क्लास के साथ भी कोशिश की, मुझे अभी भी यह त्रुटि मिलती है। मैं ग्रैडल टेस्ट रनर के साथ दौड़ता हूं और यह उम्मीद के मुताबिक काम करता है लेकिन मैं इसका इस्तेमाल टेस्ट क्लास को बार-बार चलाने के लिए नहीं कर सकता, यह देखने के लिए कि क्या मेरी टेस्ट क्लास में कोई परतदार परिणाम है

किसी भी टिप्पणी या सलाह की सराहना करें :)


java.lang.NoClassDefFoundError: io/mockk/proxy/MockKAgentFactory

    at io.mockk.impl.JvmMockKGateway.<init>(JvmMockKGateway.kt:198)
    at io.mockk.impl.JvmMockKGateway.<clinit>(JvmMockKGateway.kt:186)
    at com.example.testCorrect(Student.kt:24)
    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.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    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 com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: java.lang.ClassNotFoundException: io.mockk.proxy.MockKAgentFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 68 more
import io.mockk.mockk
import junit.framework.Assert.assertEquals
import org.junit.jupiter.api.Test

class StudentTest {
    @Test
    fun testCorrect() {
        val mockStudent = mockk<Student>()
        assertEquals(1,1)
    }
}

class Student(
    val name:String
)

enter image description here

अपडेट करें:

मैं सिर्फ एक हैलो वर्ल्ड प्रोजेक्ट बनाता हूं और ऊपर बताए अनुसार सरल कॉन्फ़िगरेशन का उपयोग करता हूं। "ग्रैडल टेस्ट रनर" कॉन्फ़िगरेशन में, यह काम करता है। लेकिन "जुनीट" कॉन्फ़िगरेशन में, वही त्रुटि हुई है

5
Long Ranger 21 अगस्त 2021, 13:46

5 जवाब

सबसे बढ़िया उत्तर

android-gradle-plugin आईडीई परियोजना आयात के दौरान रनटाइम निर्भरता को हटाता है। पहले के दिनों में Android Studio में समर्पित IDE फीचर था जो JUnit रन को बढ़ाता था कॉन्फ़िगरेशन क्लासपाथ रनटाइम निर्भरताओं को शामिल करने के लिए। अब आपको क्लासपाथ को स्वयं पुनर्प्राप्त करना होगा (या एंड्रॉइड प्रोजेक्ट्स में जुनीट रन कॉन्फ़िगरेशन से बेहतर बचें)। एंड्रॉइड स्टूडियो इस दिशा में आगे बढ़ता है कि सब कुछ ग्रैडल को सौंप दिया जाना चाहिए (उदाहरण के लिए देखें https://developer.android.com/studio/preview/features#bumblebee-unified-test-runner)।

चूंकि आप JUnit5 का उपयोग कर रहे हैं, @RepeatedTest(10_000_000) या ऐसा ही एक आसान विकल्प हो सकता है।

टीएल; डॉ;

MockKAgentFactory, io.mockk:mockk-agent-api से उपलब्ध है। मैंने आपका उदाहरण काम करने के लिए निम्नलिखित जोड़ा:

    testImplementation "io.mockk:mockk:1.12.0"
    testImplementation "io.mockk:mockk-agent-jvm:1.12.0"
    testImplementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.5.30'

ट्रिक एंड्रॉइड ग्रैडल प्लगइन में है। यह (कम से कम) 2 क्लासपाथ बनाता है: संकलन और रनटाइम। आईडीई एंड्रॉइड प्लगइन (एंड्रॉइड स्टूडियो में) कंपाइल क्लासपाथ से केवल लाइब्रेरी आयात करता है (रनटाइम प्रविष्टियां हटा दी जाती हैं)। ग्रैडल रनर के साथ परीक्षण चलाते समय, आईडीई निष्पादन को ग्रेडल को सौंपता है, और ग्रैडल रनटाइम क्लासपाथ के साथ परीक्षणों को आमंत्रित करता है। एंड्रॉइड स्टूडियो में जुनीट के साथ परीक्षण चलाते समय, जुनीट आईडीई मॉड्यूल के रनटाइम क्लासपाथ का उपयोग करता है जैसा कि आईडीई द्वारा देखा जाता है (जिसमें पहले से कोई रनटाइम लिब नहीं है क्योंकि उन्हें आयात के दौरान हटा दिया गया था)। आईडीई प्रोजेक्ट में वास्तव में क्या जोड़ा गया है, यह देखने के लिए बाहरी पुस्तकालय अनुभाग देखें। यहां छवि विवरण दर्ज करें

यदि परियोजना एक नियमित जावा परियोजना थी, तो आईडीई mockk-agent-jvm और इसकी संक्रमणीय निर्भरता mockk-agent-api जोड़ देगा। ध्यान दें कि mockk-agent-jvm, io.mockk:mockk की एक RUNTIME निर्भरता है (देखें https://repo1.maven.org/maven2/io/mockk/mockk/1.12.0/mockk-1.12.0.pom)। android-gradle-plugin आयात के दौरान रनटाइम निर्भरता को हटाता है। आईडीई से ग्रेडल रन कॉन्फ़िगरेशन के साथ चलते समय, आप किसी भी परीक्षण विधि की शुरुआत में ब्रेकपॉइंट सेट कर सकते हैं और स्टैकट्रैक की जांच कर सकते हैं। JUnitRunner को ग्रेडल द्वारा लागू करने से पहले एक फ्रेम में पूर्ण परीक्षण रनटाइम क्लासपाथ उपलब्ध है। उदा.: यहां छवि विवरण दर्ज करें

1
Kuzneц 30 अगस्त 2021, 22:33

क्या आप इसे अपने ऐप स्तर बिल्ड.ग्रेडल में जोड़ने का प्रयास कर सकते हैं:

testOptions {
    unitTests.all {
        useJUnitPlatform()
    }
}
1
akubi 29 अगस्त 2021, 02:46
Caused by: java.lang.ClassNotFoundException: io.mockk.proxy.MockKAgentFactory
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
   at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)

यह त्रुटि भाग है। यह कह रहा है कि वर्ग को अपवाद नहीं मिला जिसका अर्थ है कि कहीं एक वर्ग का उल्लेख है लेकिन नहीं मिला या मौजूद नहीं है। या यदि आप एक कार्यान्वयन का उपयोग कर रहे हैं, तो कार्यान्वयन को हटा दें और उन्हें फिर से डालें। यह मेरे लिए काम करता है। यहां तक ​​कि मुझे भी इसी मुद्दे का सामना करना पड़ा।

0
RobC 25 अगस्त 2021, 16:34

मेरे दिमाग में दो अलग-अलग समस्याएं/समाधान आते हैं।

  1. आप शायद नीचे की तरह अपने ग्रैडल कॉन्फ़िगरेशन में mockk जोड़ना भूल गए हैं:
testImplementation "io.mockk:mockk:{version}"

और शायद पिछले एंड्रॉइड स्टूडियो में, इसे ग्रैडल कैश से परोसा जा रहा था।


  1. मुझे नहीं पता क्यों, लेकिन आर्कटिक फॉक्स मेरे कस्टम स्थापित JDK (1.8) पर स्विच करता है जब भी मैं पहली बार कोई प्रोजेक्ट खोलता हूं और मुझे अपने बिल्ड में कुछ CNF अपवादों का सामना करना पड़ता है। इसे एम्बेडेड JDK में बदलने के बाद, सब कुछ वैसा ही काम करता है जैसा उसे करना चाहिए। आप प्राथमिकताएं -> बिल्ड, निष्पादन -> टूल बनाएं -> ग्रेडल पर जा सकते हैं और ग्रेड एसडीके को एंबेडेड JDK में बदल सकते हैं। जैसा कि मैं आपके स्क्रीनशॉट में देख सकता हूं, आप एक कस्टम स्थापित JDK 11 का उपयोग करके भी परीक्षण चला रहे हैं। हालांकि, mockk JDK के अंदर नहीं है, इसलिए मुझे लगता है कि मेरा पहला सुझाव बेहतर हो सकता है।

Gradle JDK

0
Amin 25 अगस्त 2021, 19:50

आप परीक्षण धावक एनोटेशन खो रहे हैं

@RunWith(MockitoJUnitRunner::class)

इसके अलावा आपको निम्नलिखित के लिए अपनी बिल्ड.ग्रेडल (ऐप) फ़ाइल की जांच करनी होगी:

testImplementation "org.mockito.kotlin:mockito-kotlin:3.2.0"
testImplementation 'org.mockito:mockito-inline:3.8.0'
0
Hussain 28 अगस्त 2021, 09:11