2012-11-14 2 views
7

Я пытаюсь запустить RunWith (PowerMockRunner.class) с моей существующей аннотацией пакета.RunWith (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), thisVersion превращается в null. Я подозреваю, что PowerMockRunner делает какую-то забавную вещь с аннотацией пакета здесь, у любого есть идея? увидеть мини-версию моего кода ниже:

+4

Я проверил загрузчик классов из junit, когда аннотируется с помощью '@RunWith (PowerMockRunner.class)'. Похоже, Powermock устанавливает свой собственный загрузчик классов, и именно так происходит магия впрыскивания издевающегося класса в тестовый пример. Я боюсь, что вы правы, пакет класса, созданного powermock, больше не аннотируется, как должно быть. – Alban

+0

@ Албан хороший поиск! любая работа вокруг? – Shengjie

+2

Я не боюсь. Глядя глубже в вашу проблему, я проверил A.class' и выяснил, что аннотация, которую вы установили на упаковке, фактически заменена прокси. Поэтому 'getAnnotation (TestAnnotation.class)' возвращает значение null. Если вы зацикливаете на список аннотаций на пакете, нет аннотации, которая представляет собой экземпляр или экземпляр суперкласса TestAnnotation.class. Аннотации, которые на самом деле находятся в пакете, являются прокси. Мне не удалось найти способ инструктировать MockClassLoader отложить загрузку системного класса загрузкой любого класса, отличного от A. Согласно java-документу, это возможно. – Alban

ответ

4

Опираясь на @ слежки Албана в комментариях, похоже, добавив эту аннотацию к вашему теста должны обойти эту проблему:

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

 Смежные вопросы

  • Нет связанных вопросов^_^