1+ package spring .memewikibe .application ;
2+
3+ import org .junit .jupiter .api .BeforeEach ;
4+ import org .junit .jupiter .api .Test ;
5+ import org .junit .jupiter .api .extension .ExtendWith ;
6+ import org .mockito .InjectMocks ;
7+ import org .mockito .Mock ;
8+ import org .mockito .junit .jupiter .MockitoExtension ;
9+ import spring .memewikibe .api .controller .meme .response .MemeSimpleResponse ;
10+
11+ import java .util .Arrays ;
12+ import java .util .List ;
13+
14+ import static org .assertj .core .api .BDDAssertions .then ;
15+ import static org .mockito .Mockito .*;
16+
17+ @ ExtendWith (MockitoExtension .class )
18+ class MemeAggregationLookUpCacheProxyServiceTest {
19+
20+ @ Mock
21+ private MemeAggregationLookUpServiceImpl mockOriginService ;
22+
23+ @ InjectMocks
24+ private MemeAggregationLookUpCacheProxyService cacheProxyService ;
25+
26+ private List <MemeSimpleResponse > testMemes ;
27+
28+ @ BeforeEach
29+ void setUp () {
30+ testMemes = Arrays .asList (
31+ new MemeSimpleResponse (1L , "무야호" , "무야호.jpg" ),
32+ new MemeSimpleResponse (2L , "나만 아니면 돼" , "나만아니면돼.jpg" ),
33+ new MemeSimpleResponse (3L , "전남친 토스트" , "전남친토스트.jpg" )
34+ );
35+ }
36+
37+ @ Test
38+ void getMostPopularMemes는_캐시가_null이면_원본_서비스를_호출하고_결과를_캐시한다 () {
39+ // given
40+ when (mockOriginService .getMostPopularMemes ()).thenReturn (testMemes );
41+
42+ // when
43+ List <MemeSimpleResponse > result = cacheProxyService .getMostPopularMemes ();
44+
45+ // then
46+ then (result ).isEqualTo (testMemes );
47+ verify (mockOriginService , times (1 )).getMostPopularMemes ();
48+ }
49+
50+ @ Test
51+ void getMostPopularMemes_캐시가_있으면_원본_서비스를_호출하지_않고_캐시를_반환한다 () {
52+ // given
53+ when (mockOriginService .getMostPopularMemes ()).thenReturn (testMemes );
54+ cacheProxyService .warmUpCache ();
55+ reset (mockOriginService );
56+
57+ // when
58+ List <MemeSimpleResponse > result = cacheProxyService .getMostPopularMemes ();
59+
60+ // then
61+ then (result ).isEqualTo (testMemes );
62+ verify (mockOriginService , never ()).getMostPopularMemes ();
63+ }
64+
65+ @ Test
66+ void getMostPopularMemes_여러_번_호출해도_첫_번째만_원본_서비스를_호출한다 () {
67+ // given
68+ when (mockOriginService .getMostPopularMemes ()).thenReturn (testMemes );
69+
70+ // when
71+ cacheProxyService .getMostPopularMemes ();
72+ cacheProxyService .getMostPopularMemes ();
73+ cacheProxyService .getMostPopularMemes ();
74+
75+ // then
76+ verify (mockOriginService , times (1 )).getMostPopularMemes ();
77+ }
78+
79+ @ Test
80+ void getMostFrequentSharedMemes는_항상_원본_서비스를_호출한다 () {
81+ // given
82+ when (mockOriginService .getMostFrequentSharedMemes ()).thenReturn (testMemes );
83+
84+ // when
85+ List <MemeSimpleResponse > result1 = cacheProxyService .getMostFrequentSharedMemes ();
86+ List <MemeSimpleResponse > result2 = cacheProxyService .getMostFrequentSharedMemes ();
87+
88+ // then
89+ then (result1 ).isEqualTo (testMemes );
90+ then (result2 ).isEqualTo (testMemes );
91+ verify (mockOriginService , times (2 )).getMostFrequentSharedMemes (); // 매번 호출
92+ }
93+
94+ @ Test
95+ void getMostFrequentCustomMemes는_항상_원본_서비스를_호출한다 () {
96+ // given
97+ when (mockOriginService .getMostFrequentCustomMemes ()).thenReturn (testMemes );
98+
99+ // when
100+ List <MemeSimpleResponse > result1 = cacheProxyService .getMostFrequentCustomMemes ();
101+ List <MemeSimpleResponse > result2 = cacheProxyService .getMostFrequentCustomMemes ();
102+
103+ // then
104+ then (result1 ).isEqualTo (testMemes );
105+ then (result2 ).isEqualTo (testMemes );
106+ verify (mockOriginService , times (2 )).getMostFrequentCustomMemes (); // 매번 호출
107+ }
108+ }
0 commit comments