From c037c698a709ee9ab14e3f9dbeda0b3dd08a5ab7 Mon Sep 17 00:00:00 2001 From: 0samsung0 <78357262+0samsung0@users.noreply.github.com> Date: Sat, 31 May 2025 18:12:18 +0300 Subject: [PATCH] add tests for logging class --- .../samples/petclinic/LoggingAspect.java | 22 ++++++--- .../samples/petclinic/LoggingAspectTest.java | 48 +++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/test/java/org/springframework/samples/petclinic/LoggingAspectTest.java diff --git a/src/main/java/org/springframework/samples/petclinic/LoggingAspect.java b/src/main/java/org/springframework/samples/petclinic/LoggingAspect.java index 95fcbbdc4..081e2c257 100644 --- a/src/main/java/org/springframework/samples/petclinic/LoggingAspect.java +++ b/src/main/java/org/springframework/samples/petclinic/LoggingAspect.java @@ -7,28 +7,38 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import java.util.function.BiFunction; +import java.util.function.Supplier; + @Aspect @Component public class LoggingAspect { private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class); + @FunctionalInterface + private interface MethodLogger { + void log(String className, String methodName, long executionTime); + } + + private final MethodLogger defaultLogger = (className, methodName, executionTime) -> + logger.info("Method {}.{} completed in {} ms", className, methodName, executionTime); + @Around("execution(* org.springframework.samples.petclinic..*.*(..))") public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable { String methodName = joinPoint.getSignature().getName(); String className = joinPoint.getTarget().getClass().getSimpleName(); - logger.info("Начало выполнения метода: {}.{}", className, methodName); + Supplier methodInfo = () -> String.format("%s.%s", className, methodName); + logger.info("Starting method: {}", methodInfo.get()); long startTime = System.currentTimeMillis(); - Object result = null; try { - result = joinPoint.proceed(); + Object result = joinPoint.proceed(); return result; } finally { - long endTime = System.currentTimeMillis(); - logger.info("Завершение выполнения метода: {}.{} (время выполнения: {} мс)", - className, methodName, (endTime - startTime)); + long executionTime = System.currentTimeMillis() - startTime; + defaultLogger.log(className, methodName, executionTime); } } } diff --git a/src/test/java/org/springframework/samples/petclinic/LoggingAspectTest.java b/src/test/java/org/springframework/samples/petclinic/LoggingAspectTest.java new file mode 100644 index 000000000..a0d49bf51 --- /dev/null +++ b/src/test/java/org/springframework/samples/petclinic/LoggingAspectTest.java @@ -0,0 +1,48 @@ +package org.springframework.samples.petclinic; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.Logger; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +import static org.mockito.Mockito.*; + +@ExtendWith({SpringExtension.class, MockitoExtension.class}) +@SpringJUnitConfig +public class LoggingAspectTest { + + @Mock + private Logger logger; + + @InjectMocks + private LoggingAspect loggingAspect; + + @Test + public void testLogMethodExecution() throws Throwable { + // Создаем тестовый метод для проверки + TestService testService = new TestService(); + + // Вызываем метод, который должен быть перехвачен аспектом + testService.testMethod(); + + // Проверяем, что логирование было вызвано + verify(logger, atLeastOnce()).info(contains("Starting method:")); + verify(logger, atLeastOnce()).info(contains("Method TestService.testMethod completed in")); + } + + // Вспомогательный класс для тестирования + private static class TestService { + public void testMethod() { + // Простой метод для тестирования + try { + Thread.sleep(100); // Имитируем некоторую работу + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } +} \ No newline at end of file