- O mantenedor principal do Mockito anunciou que, em março de 2026, encerrará cerca de 10 anos no papel de manutenção e que, nos próximos meses, fará uma transferência gradual de responsabilidades
- Como um dos gatilhos diretos da decisão, ele citou a mudança de política de agentes na JVM 22; embora concorde com a mudança em si por motivos de segurança, afirmou que a exigência de uma transição unilateral sem alternativa e a falta de consideração pelo ecossistema pesaram bastante
- Em especial, explicou que, mesmo com o Mockito sendo um dos maiores usuários de agentes da JVM, a estrutura em que teve de assumir a solução do problema sem suporte das ferramentas de build nem discussões colaborativas levou a esgotamento de recursos e excesso de responsabilidade
- Como outro fator, apontou a complexidade estrutural do suporte a Kotlin, observando que recursos desalinhados com a forma como o Kotlin opera na JVM aumentaram dentro do Mockito as APIs duplicadas e a lógica condicional, dificultando a manutenção
- Recentemente, ele vem encontrando mais prazer e motivação no trabalho com o Servo, motor web baseado em Rust, e compartilhou que, considerando o tempo pessoal limitado, chegou à conclusão de que é difícil continuar um trabalho voluntário de manutenção que passou a parecer uma obrigação
O marco de 10 anos e a decisão de transferir o papel
- Em março de 2026, ele completará 10 anos na manutenção do Mockito e vê esse momento como um ponto natural de inflexão para transferir a responsabilidade
- Nos próximos meses, pretende se concentrar, como mantenedor atual, na transferência de conhecimento e estabilização da transição
- As discussões sobre o próximo modelo de manutenção e o roadmap de longo prazo devem ocorrer em uma issue separada no GitHub
Esgotamento causado pela mudança na política de agentes da JVM
- O contexto para que, no Mockito 5, o artefato padrão fosse convertido para um agente da JVM está na mudança de política a partir da JVM 22, em que o anexo dinâmico de agentes passou a ficar escondido atrás de uma flag
- Embora concorde com a intenção da mudança do ponto de vista de segurança, ele aponta como problema o fato de a decisão ter sido tomada como dada, sem um design alternativo nem suporte à migração
- Mesmo com o Mockito tendo sido frequentemente usado como caso de ponta para recursos da JVM, nesta mudança não houve um ciclo colaborativo de feedback funcionando
- Ele avalia que a falta persistente de suporte a agentes no nível das ferramentas de build mostra que a prioridade desse recurso continua baixa
- Destaca que, quando se impõe pressão excessiva a mantenedores contribuindo de forma voluntária, a estrutura de colaboração em open source pode ruir facilmente
O peso estrutural causado pelo suporte a Kotlin
- Ele não nega a expansão do Kotlin, mas afirma que, por causa das diferenças no funcionamento interno da JVM, vários fluxos de tratamento específicos para Kotlin foram adicionados ao
mockito-core
- Há casos em que recursos do Kotlin, como funções
suspend, não funcionam de forma consistente, aumentando a duplicação de API e a complexidade
- Como resultado, a base de código ficou mais embolada e mais difícil de manter, e ele menciona com franqueza que esse trabalho não é pessoalmente prazeroso
- O futuro cada vez mais centrado em Kotlin acabou enfraquecendo sua motivação de longo prazo para manter o Mockito
Recuperando a satisfação em outras atividades open source
- Ele contribuiu para vários projetos open source e, recentemente, voltou a sentir prazer no desenvolvimento por meio do trabalho com o Servo, motor web baseado em Rust
- Entre as opções limitadas para o tempo das noites, outros projetos passaram a oferecer mais satisfação do que o Mockito
- Concluiu que não é desejável que um trabalho de manutenção voluntário permaneça por muito tempo em um estado que pareça uma obrigação
Contexto geral da decisão e a mensagem deixada
- A frustração com a mudança de política da JVM, os limites estruturais do suporte a Kotlin e a recuperação da motivação em outros projetos atuaram como os principais fatores da decisão
- Ele reconhece que esses fatores não se aplicam igualmente a todos os contribuidores e que outras pessoas podem ser mais proativas no suporte a Kotlin
- Decidiu deixar o papel por considerar que a troca de mantenedor é mais benéfica para a saúde de longo prazo do projeto
- Avalia a experiência de manutenção em open source como uma honra e um privilégio e recomenda a outras pessoas que também contribuam voluntariamente
1 comentários
Comentários do Hacker News
No meu segundo projeto no Google, acabei abandonando completamente o mocking
Ao reescrever o sistema com GWT, a cobertura de testes era obrigatória, mas cada um testava só o próprio serviço e injetava mocks via DI
Como resultado, o sistema ficou extremamente frágil, e um serviço com 8 semanas já parecia código legado. Bastava mudar a ordem do backend ou a quantidade de chamadas para passar o dia inteiro ajustando mocks
A estrutura dos módulos do Guice também era complexa, então para injetar mocks para o ambiente de teste era preciso criar um injector totalmente diferente, e no fim teste e produção viraram ambientes distintos
Além disso, muito recurso de engenharia foi desperdiçado em discussões EasyMock vs Mockito
Desde então, quase não uso mocks. Em vez disso, acho muito melhor criar serviços dummy simples que imitem o mínimo de comportamento real
Até hoje fico desconfiado quando vejo gente obcecada por mocks
Usei Mockito por 4 anos em Kotlin e, em 99% dos casos, ele foi bom o suficiente
Situações complexas ou confusas quase sempre vinham da minha falta de separação de responsabilidades
Quase não há diferença para o MockK, é mais uma diferença de sintaxe. Mas, se o Mockito deixar de ser mantido, talvez valha considerar uma troca
Mocks são mais eficazes quando a aplicação tem 4 ou 5 camadas
Eu também já abusei de DI e criei uma teia complexa de código, mas hoje limito as camadas e mantenho uma estrutura consistente
Uso mocks para testes de classe isolada, e testes de integração para validar requisitos
No fim, o importante não é a ferramenta, e sim a disciplina do desenvolvedor
Mockito é o framework de mocking mais popular em Java
Com a mudança na plataforma, o Mockito passou a ser baseado em agent, porque a partir da JVM 22 o carregamento dinâmico de agents ficou escondido atrás de uma flag
Esse tipo de mudança pode atrasar a adoção em ambientes corporativos
Essa mudança de plataforma pareceu uma transferência excessiva de responsabilidade para a comunidade do Mockito
Acho pouco saudável culpar o projeto como se ele estivesse “bloqueando o ecossistema JVM”
Manter software open source parece mesmo um trabalho desgastante
Se fosse eu, teria simplesmente arquivado tudo e saído fora. Espero que Tim finalmente encontre paz
Quero deixar meu agradecimento a TimvdLippe. Ele mostrou uma visão excelente e muita dedicação
Mockito é ok quando usado por quem realmente entende de testes
Em qualquer linguagem ou framework, testes ruins são culpa de quem os escreve
“Agent” é uma ferramenta que se acopla à JVM e pode instrumentar e modificar uma aplicação em execução
Profilers, depuradores e ferramentas de monitoramento usam esse mecanismo
Desde o Java 21, isso vem desativado por padrão por motivos de segurança, e só é permitido com a flag
-XX:+EnableDynamicAgentLoadingPara mais detalhes, veja o JEP 451