2016-01-26 6 views
0

Испытанный метод имеет следующий код:getAnnotation (класс <T>) всегда возвращает нуль, когда я использую EasyMock/PowerMock издеваться java.lang.reflect.Method

SuppressWarnings suppressWarnings = method.getAnnotation(SuppressWarnings.class); 

В моей тестовой method.I издевались java.lang.reflect.Method:

Method method= PowerMock.createMock(Method.class); 
SuppressWarnings sw = EasyMock.createMock(SuppressWarnings.class); 
EasyMock.expect(method.getAnnotation(SuppressWarnings.class)).andReturn(sw); 

В тестируемом методе
method.getAnnotation (SuppressWarnings.class); всегда возвращает null.

Я не знаю почему. Может ли кто-нибудь мне помочь?

//code: 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Anonymous { 

} 

public class AnnotationClass { 
    public Anonymous fun(Method m){ 
     Anonymous anonymous = m.getAnnotation(Anonymous.class); 
     return anonymous; 
    } 
} 

// test class: 
@RunWith(PowerMockRunner.class) 
@PrepareForTest(Method.class) 
public class AnnotationClassTest { 
    @Test 
    public void test() throws NoSuchMethodException, SecurityException { 
     AnnotationClass testClass = new AnnotationClass(); 
     final Method mockMethod = PowerMock.createMock(Method.class); 
     final Anonymous mockAnot = EasyMock.createMock(Anonymous.class); 

     EasyMock.expect(mockMethod.getAnnotation(Anonymous.class)).andReturn(mockAnot); 
     PowerMock.replay(mockMethod); 

     final Anonymous act = testClass.fun(mockMethod); 
     Assert.assertEquals(mockAnot, act); 

     PowerMock.verify(mockMethod); 
    } 
} 

error: 
java.lang.AssertionError: expected:<EasyMock for interface 
com.unittest.easymock.start.Anonymous> but was:<null> 

ответ

0

SuppressWarnings имеет @Retention(value=SOURCE) что означает, что он не доступен во время выполнения:

public static final RetentionPolicy SOURCE: Аннотации должны быть отброшены компилятором.

Однако, если бы вы попробовать код с другой аннотацией, которая доступна во время выполнения, method.getAnnotation(MyAnnotation.class) бы еще вернуться null. То есть, потому что по умолчанию издеваемое Method вернет null для вызовов методов.

Я думаю, ваша проблема в конфигурации издеваться, когда я запускаю свой код (с помощью аннотаций, который доступен во время выполнения), я получаю следующее исключение:

Exception in thread "main" java.lang.IllegalStateException: no last call on a mock available 
at org.easymock.EasyMock.getControlForLastCall(EasyMock.java:466) 
at org.easymock.EasyMock.expect(EasyMock.java:444) 
at MockStuff.main(MockStuff.java:54) 

This page имеет некоторые пояснения о том, как чтобы высмеять окончательный класс (например, Method).


Ваш код дает тот же результат для меня. Я был в состоянии заставить его работать, используя следующий код:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Method.class) 
public class AnnotationClassTest { 
    @Test 
    public void test() throws NoSuchMethodException, SecurityException { 
    final Method mockMethod = PowerMock.createMock(Method.class); 
    final Anot mockAnot = EasyMock.createMock(Anot.class); 

    EasyMock.expect(mockMethod.getAnnotation(Anot.class)).andReturn(mockAnot); 
    PowerMock.replay(mockMethod); 

    final Anot methodReturn = mockMethod.getAnnotation(Anot.class); 
    Assert.assertEquals(mockAnot, methodReturn); 
    } 
} 

@Retention(RetentionPolicy.RUNTIME) 
@interface Anot {} 

Обратите внимание, что этот код является самодостаточной, я определил интерфейс Anot, так как вы не дать определение Anonymous.

+0

Когда я использовал свои индивидуальные аннотации, которые имеют @Retention (RetentionPolicy.RUNTIME), я получил тот же результат – niaomingjian

+0

Вы правы, я обновил свой ответ. – rinde

+0

Я попробовал еще раз, но все еще не смог. Я набрал источники на странице. Не могли бы вы помочь мне исправить эту проблему? Спасибо. – niaomingjian

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

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