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.

Java cómo probar el método de aspecto.

Me gustaría escribir pruebas para mis aspectos, pero no tengo idea de cómo hacerlo o por dónde empezar. Tengo mi método de servicio que guarda algún objeto y mi aspecto de corte de punto que guarda información sobre esta operación en mi base de datos. Me gustaría escribir una prueba solo para ver si mi aspecto se ejecuta después de llamar al método del servicio, pero no sé cómo debería inyectar mis dependencias o simularlas.

Mi método de servicio:

private final BookRepository bookRepository;

public Book saveBook(final Book book){
    return bookRepository.save(book);
}

Mi aspecto:

private final BooksAudRepository booksAudRepository;
private final BookRepository bookRepository;

@After("execution(* com.library.service.BookService.saveBook(..))" +
        " && args(book)")
public void saveBookLogDb(Book book) {
    log.info("Se está capturando la operación de inserción de BookAud");
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    ReaderDetails readerDetails = (ReaderDetails) authentication.getPrincipal();
    BooksAud booksAud = buildSaveBookAud(book, readerDetails.getUsername());
    booksAudRepository.save(booksAud);
    log.info("Se está registrando la operación de inserción de BookAud");
}

Y aquí tengo mi método de prueba que es una mezcla de mis intentos de escribir esa prueba, por lo que no hay nada útil. ¿Alguien puede orientarme sobre cómo empezar esto? ¿Cómo llamo a las dependencias?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para escribir pruebas para tus aspectos, puedes usar una biblioteca como Mockito o JUnit para simular tus dependencias. Aquí tienes un ejemplo de un método de prueba utilizando Mockito:

    import static org.mockito.Mockito.*;
    
    @RunWith(MockitoJUnitRunner.class) // Esto es necesario para usar anotaciones de Mockito
    public class BookServiceTest {
    
        @InjectMocks // Esto inyectará la instancia de BookService con las dependencias simuladas
        private BookService bookService;
    
        @Mock // Esto es necesario para simular la dependencia de BookRepository
        private BookRepository bookRepository;
    
        @Mock // Esto es necesario para simular la dependencia de BooksAudRepository
        private BooksAudRepository booksAudRepository;
    
        @Before
        public void setUp() {
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void saveBook_shouldSaveBookAndLogToDb() {
            // Arrange
            Book book = new Book();
            book.setTitle("Libro de prueba");
            book.setAuthor("John Doe");
    
            // Tu aspecto se ejecutará después de esta llamada
            doAnswer(invocation -> {
                Object[] arguments = invocation.getArguments();
                bookRepository.save((Book) arguments[0]);
                return null;
            }).when(bookRepository).save(book);
    
            // Act
            bookService.saveBook(book);
    
            // Assert
            verify(bookRepository).save(book); // Verificar si el libro se guarda
            verify(booksAudRepository).save(any(BooksAud.class)); // Verificar si se guarda el registro de auditoría
        }
    }
    

    En este método de prueba, simulamos tanto las dependencias BookRepository y BooksAudRepository. También configuramos la simulación de BookRepository para llamar al método real cuando se llama bookRepository.save(book), de manera que tu aspecto pueda ser ejecutado.

    Después de eso, llamamos a bookService.saveBook(book) lo cual debería disparar el aspecto. Finalmente, verificamos que tanto el libro se guarda como el registro de auditoría se guardan en la base de datos.

    Ten en cuenta que este es solo un ejemplo de cómo probar tu aspecto. La implementación exacta dependerá de la estructura de tu proyecto y del marco de pruebas que estés utilizando.

Comments are closed.