Skip to content

Commit 7fdcb3e

Browse files
authored
BAEL-7758: How to Test a Spring AOP Aspect (#16511)
1 parent 5118193 commit 7fdcb3e

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.springaop.unittest;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
import java.util.Collections;
6+
import java.util.List;
7+
8+
@Component
9+
public class ArraySorting {
10+
11+
public <T extends Comparable<? super T>> void sort(List<T> list) {
12+
Collections.sort(list);
13+
}
14+
15+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.springaop.unittest;
2+
3+
import org.aspectj.lang.ProceedingJoinPoint;
4+
import org.aspectj.lang.annotation.Around;
5+
import org.aspectj.lang.annotation.Aspect;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.stereotype.Component;
9+
10+
@Aspect
11+
@Component
12+
public class ExecutionTimeAspect {
13+
14+
private Logger logger = LoggerFactory.getLogger(ExecutionTimeAspect.class);
15+
16+
@Around("execution(* com.baeldung.springaop.unittest.ArraySorting.sort(..))")
17+
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
18+
long t = System.currentTimeMillis();
19+
Object result = joinPoint.proceed();
20+
logger.info("Execution time=" + (System.currentTimeMillis() - t) + "ms");
21+
return result;
22+
}
23+
24+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.baeldung.springaop.unittest;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
7+
import java.io.ByteArrayOutputStream;
8+
import java.io.PrintStream;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
13+
14+
@SpringBootTest
15+
class ExecutionTimeAspectIntegrationTest {
16+
17+
@Autowired
18+
private ArraySorting arraySorting;
19+
20+
private List<Integer> getRandomNumberList(int size) {
21+
List<Integer> numberList = new ArrayList<>();
22+
for (int n=0;n<size;n++) {
23+
numberList.add((int) Math.round(Math.random() * size));
24+
}
25+
return numberList;
26+
}
27+
28+
@Test
29+
void whenSort_thenExecutionTimeIsPrinted() {
30+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
31+
PrintStream originalSystemOut = System.out;
32+
System.setOut(new PrintStream(baos));
33+
34+
arraySorting.sort(getRandomNumberList(10000));
35+
36+
System.setOut(originalSystemOut);
37+
String logOutput = baos.toString();
38+
assertThat(logOutput).contains("Execution time=");
39+
}
40+
41+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.baeldung.springaop.unittest;
2+
3+
import org.aspectj.lang.ProceedingJoinPoint;
4+
import org.junit.jupiter.api.Test;
5+
import org.junit.jupiter.api.extension.ExtendWith;
6+
import org.mockito.ArgumentCaptor;
7+
import org.mockito.InjectMocks;
8+
import org.mockito.Mock;
9+
import org.mockito.junit.jupiter.MockitoExtension;
10+
import org.slf4j.Logger;
11+
12+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
13+
import static org.mockito.ArgumentMatchers.anyString;
14+
import static org.mockito.Mockito.times;
15+
import static org.mockito.Mockito.verify;
16+
import static org.mockito.Mockito.when;
17+
18+
@ExtendWith(MockitoExtension.class)
19+
class ExecutionTimeAspectUnitTest {
20+
21+
@Mock
22+
private ProceedingJoinPoint joinPoint;
23+
24+
@Mock
25+
private Logger logger;
26+
27+
@InjectMocks
28+
private ExecutionTimeAspect aspect;
29+
30+
@Test
31+
void whenExecuteJoinPoint_thenLoggerInfoIsCalled() throws Throwable {
32+
when(joinPoint.proceed()).thenReturn(null);
33+
aspect.logExecutionTime(joinPoint);
34+
verify(joinPoint, times(1)).proceed();
35+
verify(logger, times(1)).info(anyString());
36+
}
37+
38+
@Test
39+
void whenExecuteJoinPoint_thenExecutionTimeIsLogged() throws Throwable {
40+
when(joinPoint.proceed()).thenReturn(null);
41+
aspect.logExecutionTime(joinPoint);
42+
verify(joinPoint, times(1)).proceed();
43+
44+
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
45+
verify(logger, times(1)).info(argumentCaptor.capture());
46+
assertThat(argumentCaptor.getValue()).startsWith("Execution time=");
47+
}
48+
49+
}

0 commit comments

Comments
 (0)