...
De este modo se cogerán las properties que estén presentes en este archivo, pero si no están en este pero sí en el application.properties normal, se cogerán las del application.properties.
| Info |
|---|
|
No se deben subir claves a GitLab, por lo que dejaremos en blanco las properties de usuario y password de la base de datos (el test debe mockear servicios externos, por lo que no se debe llamar a base de datos). Además, debemos poner la property spring.jpa.hibernate.ddl-auto con el valor none, para que no se compruebe la conexión a base de datos cuando arranque la aplicación para hacer un test. |
En gitlab no se están subiendo los ficheros application.properties, por lo que si tenemos test que necesiten alguna configuración de este fichero deberemos crear una variable de tipo File llamada PROPIEDADES_TEST y en Value copiar y pegar el contenido del fichero que necesitamos
...
| Bloque de código |
|---|
|
Mockito.doReturn( "asdf" ).when( expedientesService ).getExpediente( nullable( String.class ) ); |
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
...