리플랙션
Q. 리플랙션이 가능한 이유가 뭔가요 ?
- 작성한 소스코드가 JVM의 Runtime Data Area에 올라가 있기 때문이다.
- 런타임 시점에서 로드된 클래스들의 정보를 가져올 수 있기 때문에 이러한 리플랙션이 가능하다.
Q. 만약 로직이 복잡한 메서드의 접근 제어자가 private으로 막혀있을 경우 리플랙션을 이용하실건가요 ?
Q. 리플랙션의 장단점을 설명해주세요.
- 단점
- 캡슐화를 저해한다.
- 런타임 시점에서 인스턴스를 생성하므로 컴파일 시점에 해당 타입을 체크할 수 없다.
- 런타임 시점에서 인스턴스를 생성하므로 구체적인 동작 흐름을 파악하기 어렵다.
- 단순히 필드 및 메서드를 접근할 때보다 리플랙션을 사용하여 접근할 때 성능이 느리다.
enum 비교 시 equals() VS ==
Q. 동등성 검사와 동일성 검사의 차이에 대해서 알려주세요.
extracting()
Q. extracting() 에 대해서 설명해주세요.
Q. 테스트할 때 private 으로 막힌 데이터를 확인해야하는 이유.
Test Double
Q. Dummy와 Stub의 차이가 무엇인지 설명해주세요.
Q. Stub과 Spy의 차이가 무엇인지 설명해주세요.
- Dummy
- 가장 기본적인 테스트 더블
- 인스턴스화 된 객체가 필요하다.
- 기능은 필요하지 않은 경우에 사용
- Dummy 객체의 메서드가 호출되었을 때 정상 동작은 보장하지 않는다.
- 객체는 전달되지만 사용되지 않는 객체이다.
- 인스턴스화된 객체가 필요해서 구현한 가짜 객체일 뿐, 생성된 Dummy 객체는 정상적인 동작을 보장하지 않는다.
- 동작하지 않아도 테스트에는 영향을 미치지 않는 객체를 Dummy 객체라고 한다.
- Fake
- 복잡한 로직이나 객체 내부에서 필요로 하는 다른 외부 객체들의 동작을 단순화하여 구현한 객체이다.
- 동작의 구현을 가지고 있지만 실제 프로덕션에는 적합하지 않는 객체이다.
- 동작은 하지만 실제 사용되는 객체처럼 정교하게 동작하지는 않는 객체를 말한다.
- 테스트해야 하는 객체가 데이터베이스와 연관되어 있다고 가정
- 실제 데이터베이스를 연결해서 테스트해야 한다.
- 실제 데이터베이스 대신 가짜 데이터베이스 역할을 하는 FakeRepository를 만들어 테스트 객체에 주입하는 방법도 있다.
- 테스트 객체는 데이터베이스에 의존하지 않으면서도 동일하게 동작을 하는 가짜 데이터베이스를 가지게 된다.
- 이렇게 실제 객체와 동일한 역할을 하도록 만들어 사용하는 객체가 fake이다.
- Stub
- Dummy 객체가 실제로 동작하는 것처럼 보이게 만들어 놓은 객체이다.
- 인터페이스 또는 기본 클래스가 최소한으로 구현된 상태이다.
- 테스트에서 호출된 요청에 대해 미리 준비해둔 결과를 제공한다.
- 이처럼 테스트를 위해 의도한 결과만 반환되도록 하기 위한 객체가 Stub이다.
- Spy
- Stub의 역할을 가지면서 호출된 내용에 대해 약간의 정보를 기록한다.
- 테스트 더블로 구현된 객체에 자기 자신이 호출되었을 때 확인이 필요한 부분을 기록하도록 구현한다.
- 실제 객체처럼 동작시킬 수도 있고, 필요한 부분에 대해서는 Stub로 만들어서 동작을 지정할 수도 있다.
- 정리하면 실제 객체로도 사용할 수 있고 Stub 객체로도 활용할 수 있으며 필요한 경구 특정 메서드가 제대로 호출되었는지 여부를 확인할 수 있다.
- Mock
- 호출에 대한 기대를 명세하고 내용에 따라 동작하도록 프로그래밍 된 객체
@MethodSource
Q. MethodSource를 이용할 때 데이터를 static으로 띄어놔야하는 이유에 대해 설명해주세요.
Q. 클래스 단위 생명 주기에 대해서 설명해주세요.
Q. MethodSource를 이용하면 데이터 메서드가 반환할 때 제네릭 타입을 Arguments를 자주 사용하는데 Arguments에 대해서 설명해주세요.