[Testing] Mockito fails with ArrayStoreException on JDK 8 due to JSpecify TYPE_USE annotations
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
- Tipo de issue
- Bug
- Clareza
- Precisa de esclarecimento
- Status de atividade
- Pouca atividade
- Stack de tecnologia
- java
- Domínio
- testing-qa
Direção de pesquisa
Comece executando a fase de testes do Maven no JDK 8 com uma classe Stub ou Client gerada que use anotações JSpecify e um mock padrão do Mockito. Compare o mock baseado em declaração que falha com Mockito.mock(..., Mockito.withSettings().withoutAnnotations()). A issue não especifica nenhum arquivo-alvo nem critérios de aceitação; portanto, a correção pretendida e a definição of done precisam ser esclarecidas.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Description
Mockito tests running on Java 8 (JDK 1.8) crash with an ArrayStoreException / EnumConstantNotPresentExceptionProxy when attempting to mock generated Stub or Client classes that contain JSpecify annotations (@NullMarked or @Nullable).
Because JSpecify uses Type-Use (TYPE_USE) annotations, it triggers a known limitation in standard JDK 8 Java Reflection API. Standard JVM annotation parsers throw an ArrayStoreException when bytecode scanners (like ByteBuddy, underneath Mockito) introspect parameterized types, arrays, or generic descriptors holding Type-Use annotations.
Workaround
Handwritten tests aiming to maintain backwards compatibility with Java 8 while using JSpecify must explicitly disable annotation processing on mocked generated classes. Instead of standard @Mock Declaration annotations, instantiations must use:
Mockito.mock(MyStub.class, Mockito.withSettings().withoutAnnotations());.
This workaround has been successfully applied in the following integration PRs:
Reproducer
Steps to reproduce:
- Generate GAPIC veneers/stubs annotated with JSpecify @NullMarked or @Nullable (Type-Use).
- Write a handwritten unit test using Java 8 runtime.
- Instantiate standard Mockito mock for the generated class: MetricServiceStub mockStub = Mockito.mock(MetricServiceStub.class); or @Mock private MetricServiceStub mockStub;.
- Run tests and observe ArrayStoreException crash.
Code Snippets:
Failing Snippet (Standard/Declaration):
@Mock private MetricServiceStub mockMetricServiceStub; // Crashes on JDK 8
Bypass/Working Snippet (Programmatic without annotations):
private MetricServiceStub mockMetricServiceStub;
@Before
public void setUp() {
// Bypasses reflection parser crash
mockMetricServiceStub = Mockito.mock(
MetricServiceStub.class,
Mockito.withSettings().withoutAnnotations()
);
}
Logs and Stack Trace
org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.google.cloud.monitoring.v3.stub.MetricServiceStub.
Mockito can only mock non-private & non-final classes, but the root cause of this error might be different.
...
Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy
at java.lang.Class.createAnnotationData(Class.java:3521)
at java.lang.Class.annotationData(Class.java:3510)
at java.lang.Class.getDeclaredAnnotations(Class.java:3477)
Behavior
When did the issue begin? Began following PR integrations introducing JSpecify Type-Use annotations (@NullMarked, @Nullable) to generated surfaces.
Is this behavior flaky? No, it is consistently seen during the Maven Testing Phase running specifically on JDK 1.8.
- Linguagem predominante
- Java
- Estrelas
- 2.1k
- Forks
- 1.2k
- Merge médio
- 2d 14h
- PRs com merge (30d)
- 192
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de googleapis/google-cloud-java
-
[java-core] Timestamp.of(java.sql.Timestamp) is one second late for a time less than a second before the epochTalvez já em andamento @Vcode2407 assumiu há 4 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
googleapis/google-cloud-java#14636 ·
Mantenedores costumam responder em até 1 dia
-
[java-firestore] UserDataConverter encodes a pre-epoch Date with negative nanos, so the write is refusedTalvez já em andamento @wu-hui assumiu há 23 dias. Abertapriority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
googleapis/google-cloud-java#14635 · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
[java-firestore] UserDataConverter throws IndexOutOfBoundsException on an empty __binary__ valueTalvez já em andamento @wu-hui assumiu há 23 dias. Abertapriority: p2 type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
googleapis/google-cloud-java#14634 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
[java-firestore] CustomClassMapper.convertBigDecimal calls .abs() on Double, unintentionally flipping negative values to positiveTalvez livre de novo @wu-hui assumiu há 45 dias e não há nenhum pull request aberto. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
googleapis/google-cloud-java#14533 · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Github CI failing when trying to install xmllintTalvez já em andamento @blakeli0 assumiu há 81 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
googleapis/google-cloud-java#14132 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
Todas as issues de googleapis/google-cloud-java
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 80/100
finos/fluxnova-bpm-platform#387 ·
Mantenedores costumam responder em até 4 dias
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
-
Dificuldade 2/5 Menos de uma hora Facilidade para iniciantes 84/100
cpp-best-practices/project_validator#251 ·
Mantenedores costumam responder em até 1 dia
-
backend enhancement
Dificuldade 2/5 Meio dia Facilidade para iniciantes 70/100
damodharg6/payledger#16 ·
-
[Bug]: An initiative list with no current entry logs an error on every changeTalvez já em andamento @dwizard0 assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia