- Given : What software will look like to user (= pre-conditions)

- When : Things that the user will do (= event or operation)

- Then : What the user should expect (= post-conditions)

 

- Given : 시나리오 진행에 필요한 값을 설정, 테스트의 상태를 설정

- When : 시나리오 진행 필요 조건 명시, 테스트하고자 하는 행동

- Then : 시나리오를 완료했을 때 보장해야하는 결과를 명시, 예상되는 변화 설명

 

ex)

Given - 테스트에 사용할 유저객체 선언 및 이름 정의

When - 생성된 객체를 사용하여 회원가입(join(member))을 진행한다.

Then - 회원가입이 완료되었는지 확인한다.(검증)( findOne(), findMember() )

 

code)

 @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("spring");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());

    }

'spring' 카테고리의 다른 글

[Spring] DI(의존성주입-Dependency Injection)  (0) 2021.01.06

의존성 주입(Dependency Injection-DI)

(before)

public class MemberService {
   private final MemberRepository memberRepository = new
            MemoryMemberRepository();
}

이렇게 new를 통해 직접 객체를 생성하였을 경우 MemberService는 MemoryMemberRepository에 의존 된다.

이런 경우 MemoryMemberRepository()가 아닌 다른 객체를 사용하고 싶어도 코드를 직접 수정하지 않고는 불가능하다.

 

이를 다시 설명하면

 

" 객체를 필요로하는 클래스 내에서 직접 객체를 생성하는것은 클래스를 특정 객체에 커밋하는 것이고 이후에 클래스로부터 독립적으로(클래스의 수정 없이) 인스턴스의 생성을 변경하는것이 불가능하기 때문에 유연하지 못하다. 이는 다른 객체를 필요로하는 경우 클래스를 재사용할 수 없게하며, 실제 객체를 모의 객체로 대체할 수 없기 때문에 클래스를 테스트하기 힘들게한다. "

 

이러한 경우에 의존성을 없애기 위해 의존성 주입 방식을 사용하며 의존성 주입의 목적은 다음과 같다.

 

" 의존성 주입은 프로그램 디자인이 결합도 느슨하게 되도록하고 의존관계 역전 원칙  단일 책임 원칙을 따르도록 클라이언트의 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것이다"

 

"의존성 주입의 의도는 객체의 생성과 사용의 관심을 분리하는 것이다. 이는 가독성과 코드 재사용을 높혀준다."

 

(after)

public class MemberService {
	private final MemberRepository memberRepository;
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

이렇게 생성자를 통해 어떠한 객체를 받아서 MemberRepository를 생성해주면 의존성 주입을 하였다고 할 수 있다.

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;
    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
}

이렇게 MemberService에 넘겨주는 객체에 따라 의존성을 주입받을수 있다.

 

의존성주입 장점

  • 의존 관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈들간의 결합도를 낮출 수 있다.
  • 코드 재사용을 높여서 작성된 모듈을 여러 곳에서 소스코드의 수정 없이 사용할 수 있다.
  • 모의 객체등을 이용한 단위 테스트의 편의성을 높여준다.

의존성주입 방법

  • 생성자를 이용 (가장 권장)
@Controller
public class MemberController {

    private final MemberService memberService;

    //생성자 주입
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • setter를 이용
@Controller
public class MemberController {

    private final MemberService memberService;

    //setter
    @Autowired
    public setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • Field변수를 이용
@Controller
public class MemberController {

    @Autowired
    private MemberService memberService;
}

 

'spring' 카테고리의 다른 글

[Testing] Given-When-Then pattern  (0) 2021.01.06

+ Recent posts