Junit 테스트

test_code 1장 링크

test_code 2장 링크

test_code 3장 링크

위의 글을 작성할것을.. 블로그에 올리기전에 발견.. 하 노답….

지금 작성하고 있는 글은 100프로 정확하지 않으며 따라하지 않기를 권하며…. 혼자 공부한 글임을….

git source 링크

테스트 코드의 필요성

테스트 코드가 중요한것은 모든 개발자들이 동감을 할것이다. 하지만… 시간이 없어서 테스트 코드때문에 자신이 짠 비지니스 로직을 바꿔야하는 경우도 있고, 환경에 따라 값이 변하는 경우도 있다, 테스트코드에서 environment를 local 또는 dev로 설정 후 하더라도 실제 테스트 하려는 코드에서 env를 직접 주입하여 해당 환경에서 인스턴스가 올라갈경우 테스트코드의 env와 테스트 대상인 env의 설정 값이 달라 틀려질 경우도 있다. 너무나 어려운것….하….

테스트 코드를 짜게되면 비지니스 로직이 변경되거나 사이드이펙트 체크가 쉽다. 해당 부분은 다른 블로그에서 찾아서 보는 것이 빠르다.

SpringBootTest를 쓰기전에!

@SpringBootTest 를 사용하게 되면 ApplicationContext를 쉽게 생성 및 조작이 가능하다.

@RunWith(SpringRunner.class)와 스프링테스트는 같이쓰여져야 한다.

실습을 해보자

querydsl 관련 내용 블로그

위의 블로그에서 작성한 코드를 기반으로 테스트 코드를 작성해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name = "users")
@Getter
public class UserEntity {


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column
private String userId;
@Column
private String name;
@Column
private int age;

@Builder
public UserEntity(String userId, String name, int age) {

this.userId = userId;
this.name = name;
this.age = age;

}

}

옛날 소스와 많이 다르지 않지만 덕지덕지 붙어있었던 불필요한 부분 삭제를 하였다.

테스트 할 내용은 유저를 생성하고 조회한다 가정해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

@Transactional(readOnly = false)
public void createUser(String userId, String userName, int age){

userRepository.save(
UserEntity.builder().userId(userId).name(userName).age(age).build()
);

}

@Transactional(readOnly = true)
public UserEntity getUserId(String userId) throws NotFoundException {


userRepository.getByUserId(userId);
Optional<UserEntity> userEntity = Optional.ofNullable(userRepository.getByUserId(userId));

if(!userEntity.isPresent()){
throw new NotFoundException("Not Found");
}

UserInfo userInfo = new UserInfo();
userInfo.setUserAge(userEntity.get().getAge());
userInfo.setUserName(userEntity.get().getName());

return userEntity.get();

}

생성과 삭제코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49



@RunWith(SpringRunner.class)
@SpringBootTest(classes = UserService.class)
public class UserServiceTest {

@MockBean
UserRepository userRepository;


@Autowired
UserService userService;

private final String TEST_USER_ID = "powertest";
private final String TEST_USER_NAME = "룰루랄라";
private final int TEST_USER_AGE = 13;

@After
public void cleanup() {

userService.deleteUser(TEST_USER_ID);
}

@Test
public void AfterSaveUser_GetUserInfo() throws NotFoundException {


//Given 유저를 생성하였고
userService.createUser(TEST_USER_ID, TEST_USER_NAME, TEST_USER_AGE);

//When 유져를 찾을때
UserEntity userEntity = userService.getUserId(TEST_USER_ID);

//then 유저의 이름은 룰루랄라이다
assertThat(userEntity.getName(), is(TEST_USER_NAME));


}

@Test(expected = NotFoundException.class)
public void checkExpectedException() throws NotFoundException {


//When 유져를 찾을때
UserEntity userEntity = userService.getUserId("sadfsd");


}

물론 위처럼 작성하면 너무나 당연하게 통과한다… 위처럼 작성 후 다음에 다시 테스트를 돌릴경우 userId가 Unique값이라면 정상저긍로 작동하지 않을 것이다. 그렇기 때문에 After 생성한 삭제를 삭제해주자