์ํฉ Service UnitTest ์ค ๋ฐ์ ์์ธ @Before ์์ ์คํ๋๋ ์๋ Stubbing์ด ์ฐ์ด์ง ์์ ๋ฉ์๋๊ฐ ์์๋ค. given(userRepository.findByEmail(userEmail)).willReturn(Optional.of(user)); ํด๊ฒฐ @Before ์ด๋
ธํ
์ด์
์ ์ ๊ฑฐํ๊ณ , ํ์ํ ๋ฉ์๋์์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ!
๐ป ๊ฐ๋ฐ ์ผ์ง
Unit Test ? ๋จ์ ํ
์คํธ๋ Service Layer์ ๋น์ฆ๋์ค ๋ก์ง๋ง์ ๊ฒ์ฆํ๋ ๊ฒ์ด๋ฏ๋ก, Repository์ Controller์ ์ํฅ์ ๋ฐ์ง ์๋ ํ๊ฒฝ์์ ํ
์คํธ๋ฅผ ์งํํ์ฌ์ผ ํ๋ค. ํ
์คํธ์ F.I.R.S.T ์์น F - Fast: ํ
์คํธ๋ฅผ ์๋ํ๋ ๊ฒ์ ์์ด์ ์ฃผ์ถค๋์ง ์์ ๋งํผ ๋นจ๋ผ์ผ ํ๋ค. I - Independent: ๊ฐ์ฒด์ ์ํ, ๋ฉ์๋, ์ด์ ํ
์คํธ ์ํ, ๋ค๋ฅธ ๋ฉ์๋์ ๊ฒฐ๊ณผ์ ์์กดํด์๋ ์๋๋ค. R - Repeatable: ์ด๋ค ํ๊ฒฝ์์๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋๋ก ๋ฐ๋ณต ๊ฐ๋ฅํด์ผ ํ๋ค. S - Self-Validating: ๋ชจ๋ ํ
์คํธ๋ pass ํน์ fail์ ๊ฒฐ๊ณผ๋ง ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. T - Timely: ์ค์ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๊ธฐ ์ ์ ํ
์คํธ ๋์ด์ผ ํ๋ค. ์ค์ ์ฝ๋๋ฅผ ๊ตฌ..
[ ๋ฌธ์ ] ํ์ด๋จธ๋ฅผ ์ ์ฉํ๋ setInterval์ด ๊ฐํ์ ์ผ๋ก ์คํ๋์ง ์์ ์๋ก์ด window๋ฅผ ์ด์์ ๋, background.js๊ฐ ์ฌ ์คํ๋๋ฉด์, tabId๊ฐ “”๋ก ์ด๊ธฐํ ๋จ setInterval Manifest V3๋ก ์ด์ ๋๋ฉด์, chrome alarms API๋ก ๋ณ๊ฒฝ https://developer.chrome.com/docs/extensions/mv3/migrating_to_service_workers/#alarms chrome.alarms.create({ when:Date.now(), periodInMinutes: 1/60}); chrome.alarms.onAlarm.addListener(() => { // Do Action }); alarms ์ฌ์ฉ์ ์ํด, Manifest์ Perm..
[ localStorage์์ ๋ฐ์ดํฐ ์ป๊ธฐ ] ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฏธ ์น ํ์ด์ง์์ localStorage์ ์ ์ฅํ๊ณ ์์์! → localStorage ๋ด์ฉ ์ป์ด์ค๊ธฐ 1. ๋ฐ์ดํฐ ๊ฐ์ ธ์ฌ Tab์ ID ์ป๊ธฐ chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab)=>{ if(changeInfo.status === 'complete'){ if(tab.url.includes("URL์ฃผ์"){ globalTabId = tabId; } } }); ์ฌ์ฉ์๊ฐ ๋ฏธ๋ฆฌ ์ง์ ๋ URL์ ์ ์ํ ๊ฒฝ์ฐ, ํด๋น ํญ์ ID๋ฅผ ์ ์ฅ ํด๋น ํ๋ก์ ํธ์์๋ ํญ์ ์ํ๋ฅผ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ญ๋ณ์๋ก ์ ์ฅ ํ ํ์ฉ 2. localStorage ๊ฐ์ ธ์ฌ Script ์ฃผ์
chrome.scrip..