Skip to content
Pular para o conteúdo
Voltar ao Blog
MockBukkit: Testando Plugins Bukkit sem Quebrar Setup

MockBukkit: Testando Plugins Bukkit sem Quebrar Setup

Alexandru Maftei
Alexandru Maftei
@ice
Atualizado
16 visualizações
TL;DR:MockBukkit é um framework de testes Java que permite testar unitariamente plugins Bukkit e PaperMC sem executar um servidor Minecraft ativo. Simule jogadores, mundos e eventos para verificar a lógica do seu plugin isoladamente.
GitHub - Projeto da comunidade Minecraft

MockBukkit (MockBukkit/MockBukkit)

MockBukkit é um framework de mocking para Bukkit/PaperMC que permite testes unitários fáceis de plugins Bukkit.

Marque com Estrela no GitHub ↗
⭐ 725 estrelas💻 Java📋 MIT

Se você já tentou escrever testes unitários para um plugin Bukkit, sabe o incômodo: você precisa de um servidor CraftBukkit em execução, jogadores simulados, mundos e inventários, e metade da API Bukkit não funciona fora de uma instância ativa. MockBukkit existe para resolver exatamente esse problema. É um framework Java que permite testar seus plugins Bukkit isoladamente, controlando cada detalhe do estado do servidor, sem precisar iniciar um servidor Minecraft real a cada execução de teste.

Por Que Testar Plugins Bukkit é Mais Difícil do Que Parece

Plugins Bukkit estão profundamente ligados ao runtime CraftBukkit. Normalmente, se você quiser testar se seu plugin danifica corretamente a armadura de um jogador quando eles são atingidos, você precisaria:

  • Um servidor Bukkit em execução
  • Um jogador real conectado a esse servidor
  • Uma forma de simular eventos de dano
  • Acesso ao inventário desse jogador para verificar se a durabilidade da armadura mudou

Isso é muita infraestrutura para um único teste. E se você está executando um pipeline de integração contínua (CI), iniciar um servidor Minecraft para cada teste fica caro e lento. A maioria dos desenvolvedores de plugins pula testes unitários adequados completamente e apenas confiam em testes manuais no jogo, o que... bem, não é o ideal.

MockBukkit contorna isso completamente.


O Que MockBukkit Faz

MockBukkit fornece uma implementação completa de mock da API CraftBukkit que você pode controlar completamente a partir do seu código de teste. Em vez de precisar de um servidor em execução, você cria jogadores falsos, mundos e eventos todos dentro de seus testes unitários. É construído sobre Mockito internamente. Isso significa que se integra com frameworks de teste Java padrão como JUnit.

O framework suporta versões recentes do Minecraft (o lançamento mais recente é direcionado para 1.21), e é publicado no Maven Central, portanto adicionar ao seu projeto é direto. Com 725 estrelas no GitHub e manutenção ativa, é bem estabelecido na comunidade de desenvolvedores de plugins.

As capacidades principais incluem plugins simulados, jogadores simulados, mundos simulados e eventos simulados - tudo que você precisa para testar a lógica de negócios sem um servidor.


Começando com MockBukkit

Adicionando MockBukkit ao Seu Projeto

MockBukkit está disponível via Maven Central, então a configuração depende da sua ferramenta de build.

Para Gradle:

gradle
dependencies {
 testImplementation "org.mockbukkit.mockbukkit:mockbukkit-v1.21:1.0.0"
}

Para Maven:

xml
<dependency>
 <groupId>org.mockbukkit.mockbukkit</groupId>
 <artifactId>mockbukkit-v1.21</artifactId>
 <version>1.0.0</version>
 <scope>test</scope>
</dependency>

Certifique-se de que está usando a versão que corresponde à sua versão alvo do Minecraft (o projeto mantém artefatos separados para diferentes versões de servidor).

Seu Primeiro Teste

Uma vez adicionado, você pode começar a escrever testes imediatamente. MockBukkit oferece uma instância de servidor mock que você pode configurar:

java
import static org.mockbukkit.mockbukkit.MockBukkit.*;

class MyPluginTest {
 private MockBukkit server;
 private MyPlugin plugin;

 @Before
 void setUp() {
 server = mock();
 plugin = loadPlugin(MyPlugin.class);
 }

 @Test
 void testPlayerDamageTakesArmor() {
 Player player = server.addPlayer();
 player.getInventory().setArmorContents(new ItemStack[]{...});

 // Dispare sua lógica
 plugin.damagePlayer(player, 10);

 // Confirme que a armadura foi danificada
 assertTrue(player.getInventory().getArmorContents()[0].getDurability() > 0);
 }
}

Esse é o padrão básico: crie um servidor mock, carregue seu plugin, crie jogadores e mundos simulados, dispare sua lógica, depois confirme os resultados.


Recursos Principais de Teste: O Que Você Pode Simular

A força do MockBukkit é sua cobertura da API Bukkit. Aqui está o que você obtém pronto:

Jogadores Simulados: Crie jogadores sob demanda, configure seus locais, inventário, permissões e saúde. Simule eventos como dano, morte ou movimento.

Mundos Simulados: Crie múltiplos mundos, gere entidades, coloque blocos - tudo exceto a renderização real. Isso é útil se seu plugin tiver lógica específica do mundo ou verificar o tipo de bloco em um local.

Eventos Simulados: Dispare eventos Bukkit a partir do seu código de teste. Se seu plugin ouve PlayerDamageEvent, você pode disparná-lo e verificar se o plugin responde corretamente. É aqui que o verdadeiro poder reside.

Plugins Simulados: Você pode carregar seu plugin no servidor mock e verificar se ele se registra corretamente, carrega arquivos de configuração e se conecta aos eventos conforme esperado.

O framework trata das partes entediantes para que você se concentre em testar sua lógica de negócios. E se você precisar de algo que ainda não foi simulado, pode recorrer a simulação parcial ou criar doubles de teste personalizados.


Quando MockBukkit Faz Sentido (E Quando Não Faz)

MockBukkit é perfeito para testar a lógica principal do seu plugin: cálculos de dano, manipulação de inventário, verificações de permissão, tratamento de comandos personalizados. Se a principal preocupação do seu plugin é "quando um jogador faz X, Y acontece?", MockBukkit é sua resposta.

Cartão do projeto GitHub para MockBukkit/MockBukkit
Cartão do projeto GitHub para MockBukkit/MockBukkit

Mas há limites. Se você está testando interações complexas com o mundo Minecraft - como lógica de busca de caminho, cálculos de iluminação ou detecção de colisão - você atingirá os limites do MockBukkit rapidamente. Para esses casos extremos, você precisaria de testes de integração com um servidor real.

Além disso, MockBukkit testa apenas o código do seu plugin. Não testa se o próprio Bukkit funciona (spoiler: funciona). Portanto, não o use para depurar se o PlayerDamageEvent do Bukkit dispara corretamente - ele dispara. Use-o para verificar se seu plugin ouve esse evento corretamente.

Mais uma ressalva: se seu plugin depende muito de bibliotecas externas que não são facilmente simuláveis, você pode gastar mais tempo lutando com a configuração do teste do que realmente testando. Lembre-se disso ao decidir sobre a cobertura de testes.


Armadilhas Comuns e Como Evitá-las

A maioria dos novos usuários encontra um dos três problemas:

Testes pulados: Se você vir testes sendo pulados com UnimplementedOperationException, significa que você está chamando um método Bukkit que MockBukkit ainda não simulou. Verifique o rastreador de problemas do projeto - geralmente é documentado. Como uma solução alternativa, você pode às vezes usar espias Mockito para simular parcialmente o comportamento.

Problemas de tempo: Bukkit usa tarefas agendadas e operações assíncronas. Em testes, elas são executadas de forma síncrona por padrão, mas você precisa ser explícito sobre o que é agendado vs. o que é executado imediatamente. A documentação do MockBukkit explica isso claramente.

Carregamento de configuração: Se seu plugin carrega arquivos de configuração YAML, certifique-se de que sua configuração de teste cria esses arquivos no local correto. O servidor mock tem uma pasta de plugin, mas você precisa populá-la.


MockBukkit na Paisagem de Testes Mais Ampla

MockBukkit não é a única ferramenta para testar plugins Bukkit. Existem outras opções, embora MockBukkit seja a mais madura e ativamente mantida.

Alguns desenvolvedores pulam completamente frameworks de teste dedicados e apenas executam seu plugin em uma instância CraftBukkit local, depois testam manualmente no jogo. Mas isso funciona para pequenos plugins, mas não escala e torna a integração contínua muito mais difícil. Se você está sério sobre a qualidade do plugin, testes automatizados valem o investimento de configuração.

Outros usam os utilitários de teste do Spigot diretamente, mas eles são básicos em comparação com MockBukkit. MockBukkit abstrai muito do boilerplate.

Se você está construindo um plugin, deve testá-lo. E se o está testando, MockBukkit economiza horas de configuração de servidor e depuração.


Próximos Passos Práticos

Comece pequeno: escolha uma parte da lógica do seu plugin - talvez um manipulador de comando personalizado ou uma fórmula de dano - e escreva um teste para isso usando MockBukkit. Familiarize-se com como o servidor mock funciona. A partir daí, expanda sua cobertura de testes incrementalmente.

O repositório GitHub do projeto tem exemplos e um servidor Discord surpreendentemente útil se você travar. Os mantenedores são responsivos e a comunidade é acolhedora aos recém-chegados.

Se você está executando um servidor Bukkit, pode também encontrar ferramentas como nosso Gerador de Propriedades do Servidor úteis para gerenciar sua configuração do servidor - a mesma disciplina que se aplica aos testes também se aplica a manter sua configuração do servidor limpa e documentada. E se você está procurando comportamentos específicos de blocos para sua lógica de plugin, a Pesquisa de Blocos Minecraft pode lhe poupar uma viagem ao wiki.

Sobre o autor
Alexandru Maftei
Alexandru MafteiRedator-chefe

Lead writer at minecraft.how. Long-time Minecraft player running a small SMP server, testing every build, mod, and seed before writing about it.

Comentários

Nenhum comentário ainda. Seja o primeiro a compartilhar sua opinião!

We use cookies to improve your experience. By continuing to use this site, you agree to our use of cookies. Read our Privacy Policy