...
En el caso de que no queramos devolver nada, que sea un método void, en lugar de usar doReturn(...) utilizaremos doNothing().
Testear métodos @Transactional
Cuando se llama a un método @Transactional, se intentará abrir una conexión con base de datos al llamarlo, por lo que nos dará error directamente aunque hayamos mockeado las operaciones que se hagan dentro de dicho método. Para evitar esto, debemos añadir dos clases de configuración para gestionar las transacciones en los tests. Bajo una carpeta config, añadiremos estas dos clases:
| Bloque de código |
|---|
| language | java |
|---|
| title | NoOpTransactionManager.java |
|---|
|
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.DefaultTransactionStatus;
public class NoOpTransactionManager extends AbstractPlatformTransactionManager {
@Override
protected Object doGetTransaction() throws TransactionException {
return new Object();
}
@Override
protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException {
}
@Override
protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
}
@Override
protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
}
} |
| Bloque de código |
|---|
| language | java |
|---|
| title | TestConfig.java |
|---|
|
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@TestConfiguration
@EnableTransactionManagement
public class TestConfig {
@Bean
public PlatformTransactionManager transactionManager() {
// Return a mock transaction manager or a do-nothing implementation
return new NoOpTransactionManager();
}
} |
Por último, en la clase de Test en la que se pruebe el método @Transactional, añadimos la anotación @Import(TestConfig.class):
| Bloque de código |
|---|
| language | java |
|---|
| title | Clase del test correspondiente |
|---|
|
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
@Import(TestConfig.class)
class TestSolicitudes {
...
...
...
} |
Simular peticiones a servicio REST
...