সিস্টেম ক্লাসকে উপহাস করার সময় মকিতো + পাওয়ারমক লিংকেজেরর


166

আমি একটি কোড স্নিপেট পেয়েছি:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Thread.class})
public class AllMeasuresDataTest {

@Before
public void setUp() throws Exception {
}

@Test
public void testGetMeasures() {
    AllMeasuresData measure = new AllMeasuresData();
    assertEquals(measure.getMeasures(), null);
    HashMap<String, Measure> map = new HashMap<String, Measure>();
    measure.setMeasures(map);
    assertEquals(measure.getMeasures(), map);
    measure.setMeasures(null);
    assertEquals(measure.getMeasures(), null);
}

@Test
public void testAllMeasuresData() throws IOException {
    ClassLoader loader = PowerMockito.mock(ClassLoader.class);
    Thread threadMock = PowerMockito.mock(Thread.class);
    Vector<URL> vec = new Vector<URL>();
    Mockito.when(loader.getResources("measure")).thenReturn(vec.elements());
    Mockito.when(threadMock.getContextClassLoader()).thenReturn(loader);
    PowerMockito.mockStatic(Thread.class);
    Mockito.when(Thread.currentThread()).thenReturn(threadMock);
        ...
    }
}

এই পরীক্ষা চালানোর সময় আমি পেয়েছি:

java.lang.LinkageError: loader constraint violation: loader (instance of org/powermock/core/classloader/MockClassLoader) previously initiated loading for a different type with name "javax/management/MBeanServer"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:201)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:149)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at org.codecover.instrumentation.java.measurement.ProtocolImpl.initializeMBean(ProtocolImpl.java:247)
at org.codecover.instrumentation.java.measurement.ProtocolImpl.<init>(ProtocolImpl.java:237)
at org.codecover.instrumentation.java.measurement.ProtocolImpl.getInstance(ProtocolImpl.java:185)
at measure.CodeCoverCoverageCounter$6ya5ud0ow79ijrr1dvjrp4nxx60qhxeua02ta2fzpmb1d.<clinit>(MeasureCalculatorsHolder.java:146)
at measure.MeasureCalculatorsHolder.<clinit>(MeasureCalculatorsHolder.java:17)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:188)
at javassist.runtime.Desc.getClassObject(Desc.java:43)
at javassist.runtime.Desc.getClassType(Desc.java:152)
at javassist.runtime.Desc.getType(Desc.java:122)
at javassist.runtime.Desc.getType(Desc.java:78)
at algorithm.AllMeasuresDataTest.testGetMeasures(AllMeasuresDataTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:312)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl$PowerMockJUnit49MethodRunner.executeTestInSuper(PowerMockJUnit49RunnerDelegateImpl.java:116)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl$PowerMockJUnit49MethodRunner.executeTest(PowerMockJUnit49RunnerDelegateImpl.java:77)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:284)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:209)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:148)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:101)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.codecover.juniteclipse.runner.EclipseTestRunner.main(EclipseTestRunner.java:40)

আপনি কি জানেন কীভাবে আমি এটি প্রতিরোধ করতে পারি? আমি সম্ভবত এই জাতীয় কোডের টুকরোকে উপহাস করার অন্য কোনও উপায় থাকতে পারি:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
...
Enumeration<URL> resources = classLoader.getResources(path);

আপনি কী এটিকে উপহাস করার চেষ্টা করছেন? এবং কেন?
নীলশ

প্রথম পরীক্ষাটি হ'ল গেটার্স এবং সেটটার পরীক্ষা, আমি সেখানে কনস্ট্রাক্টরকে কল করছি (এবং সেখানে ব্যতিক্রম ঘটে)) দ্বিতীয়টি হল কনস্ট্রাক্টর টেস্ট। আমি তৃতীয় কোড স্নিপেটে কী কী সংস্থান আছে তা নিয়ন্ত্রণ করতে চাই।
ভোজাইচ রেসলেউলেস্কি

1
প্রথমত, আমার কাছে মনে হচ্ছে আপনার পরীক্ষাগুলি আপনার বাস্তবায়নের সাথে খুব দৃ tight়তার সাথে মিলিত হয়েছে। অভিজ্ঞতার দ্বারা, এটি ভঙ্গুর পরীক্ষার দিকে পরিচালিত করবে। পছন্দসই, আপনার পরীক্ষাগুলি লেখার সময় আপনি "ব্ল্যাক বক্স" ভাবতে চান। "কোডটির এই অংশটি কী করার কথা", "কোডটির এই টুকরোটি এটি কীভাবে করছে" তার চেয়ে। দ্বিতীয়ত, আমি মনে করি আপনি কেবল সংস্থানগুলির একটি সেট তৈরি করা থেকে ভাল এবং জাভা রানটাইমকে ক্লাসলোডিংয়ের সাথে নিজেই ডিল করতে দিন।
নীলশ

বিভিন্ন সংস্থান তৈরি করা সম্ভব, যেমন তারা পরীক্ষার ক্ষেত্রে?
ওয়াজচিয়াচ রেসজেলেউস্কি

অবশ্যই। আপনার পক্ষে সবচেয়ে সহজ হ'ল সংস্থানগুলির নামটি প্যারাম্যাট্রাইজ করা। তারপরে আপনি বিভিন্ন পরীক্ষার জন্য বিভিন্ন সংস্থার নাম পাস করতে পারেন।
নীলশ

উত্তর:


408

আপনার পরীক্ষার শ্রেণিতে এই টীকাকে যুক্ত করার চেষ্টা করুন:

@PowerMockIgnore("javax.management.*")

আমার জন্য কাজ করেছেন।


2
যথার্থতা * "আপনার পরীক্ষার ক্লাসে"। সহজ এবং দরকারী উত্তর!
পিডেমি

3
এটি কি কোড বা কনফিগারেশনের মাধ্যমেও করা যেতে পারে? আমি এটি করার কোনও উপায় খুঁজে পাইনি। আমাদের শত শত পরীক্ষা আছে ... আমি সেগুলি সব সামঞ্জস্য করতে পারি না।
ফ্রেডেরিক লাইটেনবার্গার


2
আপনি দয়া করে এই সংশোধন এর অনুপ্রবেশ এবং অর্থ ব্যাখ্যা করতে পারেন? সেই লাইনটি ব্যবহার করে আমরা পাওয়ারমকিতোকে কী নির্দেশ দিচ্ছি?
স্বপ্নিল বি।

33

এখানে গৃহীত প্রতিক্রিয়ার অনুরূপ, আমি এসএসএল সম্পর্কিত সমস্ত ক্লাস বাদ দিয়ে শেষ করেছি:

@PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.http.conn.ssl.*", "javax.net.ssl.*"})

আমার ক্লাসের শীর্ষে এটিকে যুক্ত করে ত্রুটিটি সমাধান করা হয়েছে।


5
তবুও আরও কিছু পথ যুক্ত করার দরকার পড়েছিল তবে আপনি আমার জীবনকে বাঁচিয়েছেন! @PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.*", "javax.net.ssl.*","com.sun.*"})
ফ্রান্সিসকো ল্যাপেজ-সানচো

কম.সুন সম্পর্কেও জেনে রাখা ভাল।
জেসন ডি

1
আমার নিম্নলিখিতগুলির দরকার ছিল: @ পাওয়ারমকআইগনোর (j "জাভ্যাক্স.ম্যানেজমেন্ট। *", "জাভ্যাক্স.ক্রিপ্টো। *"})
ক্রিস্টফ নেইরিন্যাক

2
এটি আমাকে বাঁচিয়েছে: @ পাওয়ারমকআইগনোর (j "জাভ্যাক্স.ম্যানেজমেন্ট। *", "Org.apache.http। *", "Com.amazonaws.http.conn.ssl। *", "Javax.net.ssl। *" , "com.sun। *", "javax.xML। *", "javax.crypto। *"})
ফায়াজ আহমেদ

26

শ্রেণিবোদ্ধার দ্বন্দ্ব, এটি ব্যবহার করুন:@PowerMockIgnore("javax.management.*")

যাক উপহাস classloader লোড করবেন না javax.*. এটা কাজ করে।


ব্যবহারের পরে @PowerMockIgnore("javax.management.*"), পরীক্ষা ক্লাস একা ভাল কাজ করে। কিন্তু Junit testসেই প্যাকেজটির মতো চলতে Failed to load ApplicationContextত্রুটি পেয়েছে । org.apache.catalina.LifecycleException: A child container failed during startইত্যাদি।
নিয়াওমিজিয়ান

8

এটি কিছুটা পুরানো বিষয় হতে পারে তবে আমিও এই সমস্যার মধ্যে পড়েছি। দেখা যাচ্ছে যে জাভা সংস্করণগুলির কিছুগুলি পাওয়ারমকিটো পরিচালনা করতে পারে না যখন পাওয়ারমক জানতে পারে একই প্যাকেজে একই নামের 2 টি শ্রেণি রয়েছে (বিভিন্ন নির্ভরতার উপরে)।

জাভা 7_25 এর চেয়ে বেশি কোনও সংস্করণ সহ এটি এই ত্রুটি দেয়।


2
"জাভা 7_25 এর চেয়ে বেশি সংস্করণের সাথে এটি এই ত্রুটি দেয়" ", এটি তথ্যবহুল।
কাজল সিনহা

এর অর্থ কী: "পাওয়ারমোকিটো পরিচালনা করতে পারে না"? এন্টোটেশন দ্বারা উপেক্ষা করার পাশাপাশি এটির মোকাবিলার কোনও উপায় আছে কি?
লাইন

এটি অনেক দিন আগে, তবে আমি মনে করি আমরা একই ধরণের প্যাকেজে একই নামের 2 টি ক্লাস নেই তা নিশ্চিত করে এটি সরেজমিন করেছি। অবশ্যই, আপনার যদি 2 টি গ্রন্থাগার থাকে তবে আপনি নির্ভর করে এবং সেগুলি সেখানে থাকে ... এটি কঠিন হতে চলেছে। এর মধ্যে এই সমস্যাটি স্থির করা হয়েছে কিনা জানি না।
রেনস গ্রাউনভেল্ড

3

সিস্টেম ক্লাসগুলিকে বিদ্রূপ করার জন্য, এমন ক্লাস প্রস্তুত করুন যা পরীক্ষার টার্গেট, তা নয় Thread.class। পাওয়ারমক ইন্সট্রুমেন্টে সক্ষম হবেন এমন কোনও উপায় নেই Thread.classকারণ এটি জেভিএম প্রারম্ভকালে প্রয়োজন Power

উপকরণ যেভাবে কাজ করে, একবার কোনও ক্লাস লোড হয়ে গেলে, এটি আর জড়িত হতে পারে না।

দেখুন PowerMock উইকি


3

পাওয়ারমক 1.7.0 এ আপনার প্রকল্পের ক্লাসপথে একটি ব্যবহারকারী-সংজ্ঞায়িত গ্লোবাল কনফিগারেশন যুক্ত করা যেতে পারে। PowerMockConfig

org/powermock/extensions/configuration.properties

বৈশিষ্ট্য ফাইলে কেবল একটি লাইন যুক্ত করুন:

powermock.global-ignore=javax.management.*

এটি আপনার প্রকল্পের সমস্ত পরীক্ষা ক্লাসের জন্য ত্রুটিটি সমাধান করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.