Registro de extensão programática do JUnit5 com @RegisterExtension
1. Visão geral
O JUnit 5 fornece vários métodos para registrar extensões. Para uma visão geral de alguns desses métodos, consulte nossoGuide to JUnit 5 Extensions.
Neste tutorial rápido, vamos nos concentrar no registro programático de extensões JUnit 5, usando a anotação@RegisterExtension.
2. @RegisterExtension
Podemos aplicar esta anotação aos campos nas classes de teste. One advantage of this method is that we can access the extension as an object in the test content directly.
O JUnit chamará os métodos de extensão nos estágios apropriados.
Por exemplo, se uma extensão implementaBeforeEachCallback,, JUnit chamará seus métodos de interface correspondentes antes de executar um método de teste.
3. Usando@RegisterExtension com campos estáticos
Quando usado com campos estáticos, JUnit aplicará os métodos desta extensão depois que as extensões baseadas em@ExtendWith em nível de classe forem aplicadas.
Além disso, o JUnit invocará retornos de chamada em nível de classe e em nível de método da extensão.
Por exemplo, a extensão a seguir apresenta uma implementaçãobeforeAllebeforeEach:
public class LoggingExtension implements
BeforeAllCallback, BeforeEachCallback {
// logger, constructor etc
@Override
public void beforeAll(ExtensionContext extensionContext)
throws Exception {
logger.info("Type {} In beforeAll : {}",
type, extensionContext.getDisplayName());
}
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
logger.info("Type {} In beforeEach : {}",
type, extensionContext.getDisplayName());
}
public String getType() {
return type;
}
}
Vamos aplicar esta extensão a um campo estático de um teste:
public class RegisterExtensionTest {
@RegisterExtension
static LoggingExtension staticExtension = new LoggingExtension("static version");
@Test
public void demoTest() {
// assertions
}
}
A saída mostra mensagens dos métodosbeforeAll ebeforeEach:
Type static version In beforeAll : RegisterExtensionTest
Type static version In beforeEach : demoTest()
4. Usando@RegisterExtension com campos de instância
Se usarmosRegisterExtension com campos não estáticos, o JUnit só aplicará a extensão depois de processar todos os retornos de chamadaTestInstancePostProcessor.
Neste caso, JUnit irá ignorar callbacks de nível de classe comobeforeAll.
No exemplo acima, vamos remover o modificadorstatic deLoggingExtension:
@RegisterExtension
LoggingExtension instanceLevelExtension = new LoggingExtension("instance version");
Agora JUnit invocará apenas o métodobeforeEach, conforme visto na saída:
Type instance version In beforeEach : demoTest()
5. Conclusão
Neste artigo, fizemos uma visão geral do registro programático de extensões JUnit 5 com@RegisterExtension.
Também abordamos a diferença entre aplicar a extensão a campos estáticos vs. campos de instância.
Como de costume, exemplos de código podem ser encontrados em nossoGithub repository.