2022. 1. 26. 20:07ใ๊ฐ๋ ์ ๋ฆฌ ์์ ์ค/๋ฌธ์ ์ ๋ฆฌ
๐ Code Content
Spring Security๋ฅผ ์ฌ์ฉํด์ ํ์๊ฐ์ , ๋ก๊ทธ์ธ ๋ฑ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํ๋ ๊ฒ์ด์์.
๋จผ์ ํ์์ด ์ ๋ง๋ค์ด์ง๋์ง Test๋ฅผ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด Test Code๋ฅผ ์์ฑํ ๊ฒ์ด์์.
package com.hongga.repository;
import com.hongga.entity.Member;
import com.hongga.entity.MemberRole;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.stream.IntStream;
/**
* ํ์ ๊ด๋ฆฌ Test Code
* <pre>
* <b>History:</b>
* ์ฃผ๋ํ๋, 1.0, 2022.01.26 ์ต์ด ์์ฑ
* </pre>
*
* @author ์ฃผ๋ํ๋
* @version 1.0, 2022.01.26 ์ต์ด ์์ฑ
* @See "์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ ์น ํ๋ก์ ํธ"
* @see <a href=""></a>
*/
@SpringBootTest
public class MemberRepositoryTest {
@Autowired private MemberRepository repository;
@Autowired private PasswordEncoder passwordEncoder;
@Test public void ํ
์คํธ์ฉ_ํ์_์์ฑ() {
// 1๋ช
๋ง Admin ์ง์
// 2 ~ 90 ๊น์ง Guest ์ง์
// 91 ~ 100 ๊น์ง Family ์ง์
String rowPwd = "1111";
IntStream.rangeClosed(1, 100).forEach(memberRoleCnt -> {
Member member = Member.builder()
.email("hongga"+memberRoleCnt+"@hongga.com")
.name("ํ
์คํธ ์ด์ฉ์"+memberRoleCnt)
.nickName("ํ
์คํธ ์ด์ฉ์"+memberRoleCnt)
.password(passwordEncoder.encode(rowPwd))
.aboutMe("์๋
ํ์ธ์? ์ฐ๋ฆฌ ๊ฐ์กฑ์๊ฒ ์ธ์ ๋ ํ๋ณต์ด ๊ฐ๋ํ๊ธธ ๋ฐ๋๋๋ค!"+memberRoleCnt)
.build();
// Admin ์ญํ
if (memberRoleCnt == 1) {
member.addMemberRole(MemberRole.ADMIN);
} // if๋ฌธ ๋
if (memberRoleCnt > 90) {
member.addMemberRole(MemberRole.GUEST);
} // if๋ฌธ ๋
if (memberRoleCnt >= 100) {
member.addMemberRole(MemberRole.FAMILY);
}
repository.save(member);
});
} // ํ
์คํธ์ฉ_ํ์_์์ฑ() ๋
} // class ๋
โ ๏ธ ๋ฌธ์ ๋ฐ์!
์์ Test Code๋ฅผ ์คํํ๋ ๋ค์๊ณผ ๊ฐ์ด Null Pointer Exception์ด ๋ฐ์ํ ๊ฒ์ด์์!
๋น๋ ํจํด์ผ๋ก .password์ ๋ถ๋ช ํ ๊ฐ์ ์ง์ด๋ฃ์ด ์คฌ๋๋ฐ, ์? ๋๋ฌธ์? ์ด๋ฌ๋์ง ์ ํ ๋ชจ๋ฅด๊ฒ ๋๋ฐ, ๋๋์ด ๋ต์ ์์๋ต๋๋ค!
๐ป ๋ฌธ์ ํด๊ฒฐ!
package com.hongga.repository;
import com.hongga.entity.Member;
import com.hongga.entity.MemberRole;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.stream.IntStream;
/**
* ํ์ ๊ด๋ฆฌ Test Code
* <pre>
* <b>History:</b>
* ์ฃผ๋ํ๋, 1.0, 2022.01.26 ์ต์ด ์์ฑ
* </pre>
*
* @author ์ฃผ๋ํ๋
* @version 1.0, 2022.01.26 ์ต์ด ์์ฑ
* @See "์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ ์น ํ๋ก์ ํธ"
* @see <a href=""></a>
*/
@SpringBootTest @RunWith(SpringRunner.class)
public class MemberRepositoryTest {
@Autowired private MemberRepository repository;
@Autowired private PasswordEncoder passwordEncoder;
@Test public void ํ
์คํธ์ฉ_ํ์_์์ฑ() {
// 1๋ช
๋ง Admin ์ง์
// 2 ~ 90 ๊น์ง Guest ์ง์
// 91 ~ 100 ๊น์ง Family ์ง์
String rowPwd = "1111";
IntStream.rangeClosed(1, 100).forEach(memberRoleCnt -> {
Member member = Member.builder()
.email("hongga"+memberRoleCnt+"@hongga.com")
.name("ํ
์คํธ ์ด์ฉ์"+memberRoleCnt)
.nickName("ํ
์คํธ ์ด์ฉ์"+memberRoleCnt)
.password(passwordEncoder.encode(rowPwd))
.aboutMe("์๋
ํ์ธ์? ์ฐ๋ฆฌ ๊ฐ์กฑ์๊ฒ ์ธ์ ๋ ํ๋ณต์ด ๊ฐ๋ํ๊ธธ ๋ฐ๋๋๋ค!"+memberRoleCnt)
.build();
// Admin ์ญํ
if (memberRoleCnt == 1) {
member.addMemberRole(MemberRole.ADMIN);
} // if๋ฌธ ๋
if (memberRoleCnt > 90) {
member.addMemberRole(MemberRole.GUEST);
} // if๋ฌธ ๋
if (memberRoleCnt >= 100) {
member.addMemberRole(MemberRole.FAMILY);
}
repository.save(member);
});
} // ํ
์คํธ์ฉ_ํ์_์์ฑ() ๋
} // class ๋
Class ์ด๋ฆ ์์ ๋ณด์๋ฉด @RunWith๋ผ๋ Annotaion์ด ์ถ๊ฐ ๋ ๊ฒ์ ์์ค ์ ์์ผ์ค ๊ฒ์ด์์.
๐ฝ ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ
์์์ ์๋ ์ฝ๋์ Import๋ฅผ ๋ณด์๋ฉด Test๋ถ๋ถ์ด 'org.junit.Test'๋ก ๋์ด ์๋๋ฐ, ์ด ๋ถ๋ถ์ 'org.junit.jupiter.api.Test"๋ก ๋ฐ๊ฟ์ฃผ๋ฉด @RunWith๋ฅผ ๋ถํ์ง ์์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ ํ๊ณ ๋๋ ์ ๊ฐ ์ํ๋ Test๋ฅผ ์ ์์ ์ผ๋ก ์ํํ ์ ์์๋ ๊ฒ์ด์์.
DB๋ฅผ ํ์ธ ํด ๋ณด๋ ์์ฃผ ๋ง์กฑ์ค๋ฝ๊ฒ ์ ๋ค์ด๊ฐ ๊ฒ์ด์์!
๐ค ์์ธ ๋ถ์
๊ทธ๋ ๋ค๋ฉด ๋๋์ฒด ์? ์ Annotaion์ ์ฐ์ง ์์์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ผ๊น์?
๊ทธ๊ฒ์ ๋ฐ๋ก SpringBootTest๋ฅผ ์ฌ์ฉํด์ Test๋ฅผ ์งํํ๋ ค๊ณ ํ๋ฉด JUnit์ด ์์ํ๋ ค๋ SpringRunner Class๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ด๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ Bean์ผ๋ก ๋ฑ๋กํ๋ ค๊ณ ํ์๋ PasswordEncoder๊ฐ ๋ฑ๋ก๋์ง ์์ ๊ฒฐ๊ณผ์ ์ผ๋ก passoword๊ฐ NPE๊ฐ ๋ฐ์ํ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ ์๋ฃ :
@RunWith(SpringRunner.class)
1. @RunWith๋ JUnit Framwork๊ฐ Test๋ฅผ ์คํํ ๋ ๋ด์ฅ๋ Runner๋ฅผ ์คํ.
2. @SpringBootTest๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JUnit SpringJUnit4ClassRunner Class๋ฅผ ์์๋ฐ๋ @RunWith(SpringRunner.class)๋ฅผ ์์ ๋ฐ์์ ์ฌ์ฉํด์ผ ํ๋ค.
@SpringBootTest
1. ํตํฉ ํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ Annotation.
2. ์ฌ๋ฌ ๋จ์ ํ ์คํธ๋ฅผ ํ๋์ ํตํฉ ํ ์คํธ๋ก ์ํํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋๋ฐ, ์ดํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๋ชจ๋ Loadํ๊ธฐ ๋๋ฌธ์ ์ดํ๋ฆฌ์ผ์ด์ ๊ท๋ชจ๊ฐ ํด์๋ก ๋๋ ค์ง๋ค๋ ๋จ์ ์ด ์๋ค.
@DataJpaTest
1. SpringBoot์์ JPA๋ฅผ ํ ์คํธ ํ ์ ์๋๋ก ์ ๊ณตํ๋ ๊ฒ.
2. ๋จ์ ํ ์คํธ๊ฐ ๋๋ ๋ ๋ง๋ค ์๋์ผ๋ก DB๋ฅผ RollBack ํด์ค๋ค.
3. In Memory DB๋ฅผ ์ฌ์ฉ.
4. ์ค์ DB์์ ํ ์คํธ๋ฅผ ํ๋ ค๊ณ ํ๋ค๋ฉด @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)์ ์ถ๊ฐ ํด์ฃผ์ด์ผ ํ๋ค.
๊ธฐํ
@SpringBootTest : ํตํฉ ํ ์คํธ, ์ ์ฒด - Bean ์ ์ฒด
@WebMvcTest : ๋จ์ ํ ์คํธ, MVC ํ ์คํธ, MVC ๊ด๋ จ Bean
@DataJpaTest : ๋จ์ ํ ์คํธ, JPA ํ ์คํธ - JPA ๊ด๋ จ Bean
@RestClientTest : ๋จ์ ํ ์คํธ, Rest API ํ ์คํธ - ์ผ๋ถ Bean
@JsonTest : ๋จ์ ํ ์คํธ, Json ํ ์คํธ - ์ผ๋ถ Bean
๐ ์ฐธ๊ณ ์๋ฃ
https://n1tjrgns.tistory.com/224