2012-11-14 21 views
7

के साथ काम नहीं करता है। मैं अपने मौजूदा पैकेज एनोटेशन के साथ काम कर रहे RunWith (PowerMockRunner.class) को चलाने का प्रयास कर रहा हूं।रनविथ (PowerMockRunner.class) पैकेज एनोटेशन

वर्ज़न:

powermock 1.4.12 mockito 1.9.0 JUnit 4.8.2

package-info.java // इस पैकेज एनोटेशन

@TestAnnotation(version="1.0") 
package com.smin.dummy; 

के लिए है TestAnnotation.java // यह "com.smin.dummy" पैकेज के लिए मेटाडेटा एनोटेशन क्लास है

package com.smin.dummy; 

import java.lang.annotation.*; 

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.PACKAGE) 
public @interface TestAnnotation { 
    String version(); 
} 

A.java

package com.smin.dummy; 

public class A { 
    private static Package myPackage; 
    private static TestAnnotation version; 

    static { 
     myPackage = TestAnnotation.class.getPackage(); 
     version = myPackage.getAnnotation(TestAnnotation.class); 
    } 

    public static String getVersion() { 
     return version.version(); 
    } 
} 

MockA.java

package com.smin.dummy; 


import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import com.smin.dummy.A; 

@RunWith(PowerMockRunner.class) //comment out this line to see the difference 
@PrepareForTest(A.class) 
public class MockA { 
@Test 
public void test_mocked() throws Throwable { 
    String thisVersion = A.getVersion(); 
    System.out.println(thisVersion); 
} 
} 

UniTest में MockA.java, अगर मैं RunWith(PowerMockRunner.class) का उपयोग नहीं करते, मैं मिल जाएगा thisVersion मुद्रित 0.1 मुद्रित के रूप में। लेकिन RunWith(PowerMockRunner.class) जोड़ने के बाद, thisVersionnull में बदल जाता है। मुझे संदेह है कि PowerMockRunner यहां पैकेज एनोटेशन के साथ कुछ मजेदार चीज कर रहा है, किसी को भी कोई विचार है? नीचे मेरी कोड के लघु संस्करण देखें:

+4

मैं के वर्ग लोडर का निरीक्षण किया जूनिट टेस्ट, जब @RunWith (PowerMockRunner.class) 'के साथ एनोटेट किया गया। ऐसा लगता है कि पावरमॉक अपना खुद का वर्ग लोडर स्थापित कर रहा है, और इसी तरह परीक्षण मामले में मजाकिया वर्ग इंजेक्शन देने का जादू होता है। मुझे डर है कि आप सही हैं, पावरमॉक द्वारा उत्पन्न कक्षा का पैकेज अब एनोटेटेड नहीं होना चाहिए। – Alban

+0

@ अल्बान अच्छी खोज! आसपास कोई काम? – Shengjie

+2

मुझे डर नहीं है। आपकी समस्या पर गहरी लग रही है, मैंने एक्लास 'का निरीक्षण किया, और पाया कि पैकेजिस पर सेट की गई एनोटेशन वास्तव में प्रॉक्सी द्वारा प्रतिस्थापित की गई है। तो 'getNnotation (TestAnnotation.class) 'शून्य वापस आता है। यदि आप पैकेज पर एनोटेशन की सूची में लूप करते हैं, तो कोई एनोटेशन नहीं है जो एक उदाहरण है या TestAnnotation.class का एक सुपर क्लास उदाहरण है। वास्तव में पैकेज पर मौजूद एनोटेशन एक प्रॉक्सी है। मैं सिस्टम क्लास लोडर को ए के अलावा किसी भी वर्ग की लोडिंग को रोकने के लिए MockClassLoader को निर्देश देने का एक तरीका खोजने में विफल रहा। जावा दस्तावेज़ के मुताबिक, यह संभव है। – Alban

उत्तर

4

@ टिप्पणी में एल्बन के sleuthing पर बिल्डिंग, यह आपके परीक्षण का मामला को यह एनोटेशन जोड़ने समस्या को दरकिनार करना चाहिए की तरह दिखता है:

@PowerMockIgnore("com.smin.dummy.TestAnnotation")