본문 바로가기
SpringBoot

@InjectMocks 한 객체에 given()을 주면 어떻게 될까?

by 오렌지마끼야또 2023. 11. 30.
728x90
반응형

 

 

 

 

테스트코드를 작성하면서 의존성이 있는 객체의 메소드에 given().willReturn()을 설정했는데 예상했던대로 동작하지 않았습니다. 상황을 재연하면서 그 이유와, 어떻게 동작되는지를 알아보겠습니다.

 

 

CalculatorService를 만들었고 add도메인과, sub도메인을 만들어서 덧셈, 뺄셈 기능을 사용하였습니다. 그리고 곱하기는 Multiplier 클래스를 상속받아 사용하였습니다.

------------------------------------

 

 

 

그리고 테스트코드는 아래와 같이 작성했습니다.

 

처음 생각했던 것은 메소드 3개에 다 given()을 주었으니까 150이 나오겠지? 였습니다. 결과는?

다르게 나왔습니다.. mul 메소드에서 제가 given()으로 준 값이 아닌 코드상의 정상적인 계산이 이루어졌습니다.

 

 

이유는 바로 mul 메소드를 가진 객체인 CalculatorService 를 @InjectMocks 했기 때문입니다.

위 코드의 의미는 실제 CalculatorService 에 가짜객체로 만든 AddDomainService, SubDomainService 를 주입하겠다는 뜻입니다. 포인트는 CalculatorService가 "실제 객체" 라는 것입니다.

 

그래서 아래와 같이 add와 sub는 given()이 정상적으로 동작했지만 extends 받은 Multiplier의 mul 메소드는 실제로 동작하였습니다.

 

 

그런데 위에 결과값을 다시 보시면 제가 print 해놓은 것이 두번 반복되서 출력되었죠? 이렇게 동작했기 때문입니다.

 

 

그러면 mul 메소드의 given().willReturn(100.0) 은 어디로 갔느냐?

바로 mul 메소드 안에 있는 addDomainService.testAdd() 에 설정되었습니다.

addDomainService 를 @Mock 으로 만들었지만 testAdd() 메소드에 대한 given()은 주지 않았었죠.

그것이 여기에 설정된 것입니다.

@Mock으로 설정한 객체의 given을 주지 않은 메소드에 적용되는 것이죠.

그래서 위의 결과창에 "두 수의 테스트 합은 : 100.0 입니다." 라고 출력된 이유입니다.

 

 

만약에1

given().willReturn(100.0) 을 받을 곳이 없다면?

너 여기 잘못짰어~ 하며 에러를 내버립니다.

 

 

만약에2

@Mock 으로 주지 않은 객체의 메소드를 호출한다면?

없는 객체이기 때문에 NullPointerException 이 발생합니다.

 

 

 

 

@InjectMocks 한 객체의 메소드에 given()을 설정했을 때 어떻게 되는지를 알아보았습니다. 여러분들은 저와 같은 실수를 하지 마시기 바랍니다..ㅎ

 

 

 

 

 

 

728x90
반응형

댓글