Back-end/Spring

[Spring] JUnit - ์˜ˆ์™ธ์กฐ๊ฑด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ

๐Ÿ’ก ๋งŒ์•ฝ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋œ ํŒŒ๋ฆฌ๋ฏธํ„ฐ ๊ฐ’์ด ์—†์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ?

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• :

  1. null๊ณผ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ฐ’์„ ๋ฆฌํ„ด
  2. ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.

 

1๋ฒˆ์€ ๊ตฌํ˜„ํ•˜๊ธฐ ๊ฐ„๋‹จํ•˜๋‹ˆ 2๋ฒˆ์„ ์ฒœ์ฒœํžˆ ๊ตฌํ˜„ํ•ด๋ณด์ž.

 

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด ํ•ด๋‹นํ•˜๋Š” ์ •๋ณด๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜ ํ•„์š”ํ•œ๋ฐ

์Šคํ”„๋ง์ด ๋ฏธ๋ฆฌ ์ •์˜ํ•ด ๋†“์€ ์˜ˆ์™ธ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๊ฐ€์ ธ๋‹ค ์จ๋„ ๋œ๋‹ค.

 

์ง€๊ธˆ๋ถ€ํ„ฐ UserDao์˜ get() ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋œ id๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์—†์„ ๋•Œ

์˜ˆ์™ธ๋ฅผ ๋˜์ ธ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.

 

์˜ˆ์™ธ ํด๋ž˜์Šค๋กœ๋Š” EmptyResultDataAccessException์„ ์‚ฌ์šฉํ• ๊ฑด๋ฐ,

๋จผ์ € java.org.springframework.dao ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค ์›ํ™œ์ด ์ˆ˜ํ–‰๋˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต์ธ๋ฐ,

์˜ˆ์™ธ์กฐ๊ฑด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค๋ฅด๋‹ค.

 

์ด ํ…Œ์ŠคํŠธ๋Š” ๋ฐ˜๋Œ€๋กœ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ์ค‘์— ํŠน์ • ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง€๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๊ณ ,

์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง€์ง€ ์•Š๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ž‘์—…์„ ๋งˆ์น˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

 

โœ๏ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

@Test ์• ๋…ธํ…Œ์ด์…˜์˜ expected ์•จ๋ฆฌ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ,

expected์— ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•˜๋ฆฌ๋ผ ๊ธฐ๋Œ€ํ•˜๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

@Test(expected=ExceptionClass)

 

expected๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณดํ†ต์˜ ํ…Œ์ŠคํŠธ์™€ ๋ฐ˜๋Œ€๋กœ

์ •์ƒ์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งˆ์น˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ณ , expected์—์„œ ์ง€์ •ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์ง€๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•œ๋‹ค.

 

์˜ˆ์™ธ์กฐ๊ฑด์— ๋Œ€ํ•œ getUserFailure ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ

@Test(expected=EmptyResultDataAccessException.class)
	public void getUserFailure() throws SQLException, ClassNotFoundException {
		ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
		
		UserDao dao = context.getBean("userDao", UserDao.class);
		dao.deleteAll();
		assertThat(dao.getCount(), is(0));
		
		dao.get("unknown_id"); 
		
	}

์œ„์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด๋„ ์•„์ง ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์™œ๋ƒํ•˜๋ฉด,

userDao์—์„œ rs.next()๋ฅผ ์‹คํ–‰ ํ•  ๋•Œ ๊ฐ€์ ธ์˜ฌ ๋กœ์šฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— SQLException์ด ๋ฐœ์ƒํ•ด

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” EmptyResultDataAccessException์ด ์•„๋‹Œ SQLException์„ ๋ฐ›์•„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๋œฐ ๊ฒƒ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ UserDao์˜ get() ๋ฉ”์†Œ๋“œ์˜ ์ฝ”๋“œ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

public User get(String id) throws ClassNotFoundException, SQLException {
	
		Connection c = dataSource.getConnection();
        PreparedStatement ps = c.prepareStatement(
                "select * from users where id = ?");
		ps.setString(1,  id);
		
		ResultSet rs = ps.executeQuery();
		
		User user = null;
		
		if(rs.next()) {
			user = new User();
			user.setId(rs.getString("id"));
			user.setName(rs.getString("name"));
			user.setPassword(rs.getString("password"));
		}
		
		
		rs.close();
		ps.close();
		c.close();
		
		if(user==null) throw new EmptyResultDataAccessException(1);
        //user์— ์•„๋ฌด๊ฐ’๋„ ์—†์„ ์‹œ EmptyResultDataAccessException ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์ฃผ๋„๋ก ํ•˜์ž
       
        
        return user;
	}

 

๐Ÿ“ƒ ์ •๋ฆฌ

 

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ DAO๋Š” ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ,

์ฝ”๋“œ ๋‚ด์šฉ์— ์ƒ๊ด€ ์—†์ด ํฌ๊ด„์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋‘๋Š” ํŽธํžˆ ํ›จ์”ฌ ์•ˆ์ „ํ•˜๊ณ  ์œ ์šฉ

 

๋˜ํ•œ ๊ฐœ๋ฐœ์ž๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ๋•Œ ์„ฑ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ๋งŒ ๊ณจ๋ผ์„œ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

"๋‚ด PC์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐ"๋ผ๋Š” ๋ณ€๋ช…์„ ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

 

์Šคํ”„๋ง์˜ ์ฐฝ์‹œ์ž์ธ ๋กœ๋“œ ์กด์Šจ์ด ํ•œ ๋ง ์ฒ˜๋Ÿผ 'ํ•ญ์ƒ ๋„ค๊ฑฐํ‹ฐ๋ธŒ ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ๋งŒ๋“ค๋ผ' ๋ฅผ ๊ธฐ์–ตํ•˜๋ฉฐ,

 

ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ถ€์ •์ ์ธ ์ผ€์ด์Šค๋ฅผ ๋จผ์ € ๋งŒ๋“œ๋Š” ์Šต๊ด€์„ ๋“ค์ด์ž!!

 

์ฝ”๋“œ ์ €์žฅ์†Œ : https://github.com/withseungryu

 

withseungryu - Overview

exchange student at georgia college & state university - withseungryu

github.com

์ฐธ๊ณ  ๋ฌธ์„œ : 

ํ† ๋น„์˜ ์Šคํ”„๋ง3 (์ด์ผ๋ฏผ)

๋ฐ˜์‘ํ˜•