es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prueba de MyBatis no encontrando el mapper.

Estoy intentando realizar una prueba JUnit 5 simple con Spring Boot y Mybatis… @Autowired no puede encontrar mi mapper.

org.springframework.beans.factory.NoSuchBeanDefinitionException: No se encontró ningún bean que califique como candidato a autowire del tipo 'fehrm.servicelayer.mapper.EnqueueStatusDao' disponible: se esperaba al menos 1 bean. Anotaciones de dependencia: {@org.springframework.beans.factory.annotation.Autowired (necesario = true)}
    en org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
    en org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
    en org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)

Estoy usando
spring-boot: 2.6.1
JUnit 5.8.1
mybatis-starter 2.2.0

Por supuesto, todo funciona en la aplicación. Solo tengo problemas para hacer que el mapper se autowire en la prueba.

Aquí está la clase de prueba:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.context.annotation.Import;

import fehrm.servicelayer.domain.EnqueueStatus;
import fehrm.servicelayer.mapper.EnqueueStatusDao;

@MybatisTest
@ActiveProfiles("test")
@Import(EnqueueStatusDao.class)
public class EnqueueStatusDaoTest {

@Autowired
private EnqueueStatusDao enqueueStatusDao;

@Test
public void testSelect()
{
    EnqueueStatus es = enqueueStatusDao.selectEnqueuePatient("1000000050");
     Assertions.assertNotNull(es);

}

@Test
public void testDelete()
{
    enqueueStatusDao.delete("1000000050");
    EnqueueStatus es = enqueueStatusDao.selectEnqueuePatient("1000000050");
    Assertions.assertNull(es);
}

}

He seguido las instrucciones de mybats-autoconfiture.

Ahí se menciona agregar una clase @SpringBootApplcation en algún paquete como la carpeta de prueba. He hecho eso y el resultado es el error anterior.

Si elimino la @SpringBootApplication, obtengo este error:

Could not detect default configuration classes for test class [com.fehrm.servicelayer.mapper.EnqueueStatusDaoTest]: EnqueueStatusDaoTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece ser que el bean EnqueueStatusDao no está siendo creado o registrado correctamente en el contexto de Spring en el ambiente de prueba.

    Aquí hay algunas cosas que puedes revisar:

    1. Asegúrate de que la interfaz y la implementación de EnqueueStatusDao estén correctamente anotadas con @Mapper y @Repository respectivamente.
    2. Intenta agregar la anotación @MapperScan a tu clase de prueba y especifica el paquete donde se encuentra la interfaz EnqueueStatusMapper.

      @MybatisTest
      @ActiveProfiles("test")
      @Import(EnqueueStatusDao.class)
      @MapperScan("fehrm.servicelayer.mapper") // agrega esta línea
      public class EnqueueStatusDaoTest {
         // ...
      }
      

      Esto debería escanear el paquete especificado y registrar todas las interfaces mapper como beans en el contexto.

    3. También puedes intentar agregar @RunWith(SpringRunner.class) a tu clase de prueba y ver si eso ayuda.

      @RunWith(SpringRunner.class) // agrega esta línea
      @MybatisTest
      @ActiveProfiles("test")
      @Import(EnqueueStatusDao.class)
      public class EnqueueStatusDaoTest {
         // ...
      }
      

      @RunWith(SpringRunner.class) se usa para ejecutar pruebas de JUnit con soporte de Spring. Podría ayudar con el registro e inyección de beans.

    Si ninguna de estas opciones funciona, por favor revisa que el bean EnqueueStatusDao esté siendo creado y registrado correctamente en el ambiente de aplicación.

Comments are closed.