Мокито стирает аннотации, примененные к моему классу - PullRequest
0 голосов
/ 13 марта 2020

У меня есть аннотация,

@Retention(RetentionPolicy.RUNTIME) 
@Target(value={ElementType.METHOD, ElementType.TYPE})
public @interface JobLoggable {
    JobType jobType();
    JobDomain domain();
    JobStatus jobInitialStatus();
}

, которую я применяю к своему классу

@JobLoggable
public class Process {
    public void doSomething() {
        Annotation[] annotations = this.getClass().getAnnotations();
        Assert.assert(annotations.length == 1);
    }
}

В моем тесте я шпионю за ним (не издевайтесь над ним, хотя он не должен вещество):

public class Test {
    @Test
    public void test() {
        Process process = Mockito.spy(Process.class);
        //spy on some internal methods, capture their return values
        process.doSomething();
    }
}

К сожалению, this.getClass (). getAnnotations () не возвращает аннотаций. Когда я смотрю, к какому классу относится экземпляр, это: Process $$ EnhancerByMockitoWithCGLIB $$ 3db5579b

Это не настоящий класс Process. Я полагаю, именно поэтому не удается получить аннотации.

Возможно, в этом есть какая-то хитрость. Любые идеи? Спасибо, ребята.

Я уже пытался смоделировать getClass () на экземпляре процесса, но он является окончательным, поэтому его нельзя сменить.

1 Ответ

0 голосов
/ 14 марта 2020

Я был озадачен этой проблемой, пока не прочитал эту документацию :

38. Сохранение метаданных и обобщенного типа c (начиная с версии 2.1.0)

Mockito теперь сохраняет аннотации к имитированным методам и типам, а также обобщенные метаданные c. Ранее фиктивный тип не сохранял аннотации к типам, если они не были явно унаследованы и никогда не сохраняли аннотации для методов. Как следствие, теперь выполняются следующие условия:

Похоже, что решение просто обновляется до> 2.1.0 mockito. Я использовал 1.10.19. Если вы используете Java 7, вам, возможно, придется перейти на Java 8.

...