@Mock과 @InjectMocks의 차이점
와의 차이는 무엇입니까?@Mock
그리고.@InjectMocks
모키토 틀에서요?
@Mock
모크를 만듭니다. @InjectMocks
클래스의 인스턴스를 만들고 를 사용하여 작성된 모크를 주입합니다.@Mock
(또는@Spy
)의 주석을 이 인스턴스에 추가합니다.
주의:@RunWith(MockitoJUnitRunner.class)
또는Mockito.initMocks(this)
(JUnit 4).
JUnit 5에서는,@ExtendWith(MockitoExtension.class)
.
@RunWith(MockitoJUnitRunner.class) // JUnit 4
// @ExtendWith(MockitoExtension.class) for JUnit 5
public class SomeManagerTest {
@InjectMocks
private SomeManager someManager;
@Mock
private SomeDependency someDependency; // this will be injected into someManager
// tests...
}
이것은, 다음의 방법에 관한 샘플 코드입니다.@Mock
그리고.@InjectMocks
작동하다.
예를 들어 다음과 같습니다.Game
그리고.Player
학급.
class Game {
private Player player;
public Game(Player player) {
this.player = player;
}
public String attack() {
return "Player attack with: " + player.getWeapon();
}
}
class Player {
private String weapon;
public Player(String weapon) {
this.weapon = weapon;
}
String getWeapon() {
return weapon;
}
}
보시다시피.Game
계급의 필요성Player
연주하다attack
.
@RunWith(MockitoJUnitRunner.class)
class GameTest {
@Mock
Player player;
@InjectMocks
Game game;
@Test
public void attackWithSwordTest() throws Exception {
Mockito.when(player.getWeapon()).thenReturn("Sword");
assertEquals("Player attack with: Sword", game.attack());
}
}
Mockito는 플레이어 클래스를 조롱할 것이고 그 행동은when
그리고.thenReturn
방법.마지막으로 사용방법@InjectMocks
모키토는 그렇게 말할 것이다.Player
안으로Game
.
작성은 불필요합니다.new Game
물건.모키토가 주사해 줄 거야
// you don't have to do this
Game game = new Game(player);
또한 다음을 사용하여 동일한 동작을 취할 수 있습니다.@Spy
주석입니다.Atribute 이름이 다른 경우에도.
@RunWith(MockitoJUnitRunner.class)
public class GameTest {
@Mock Player player;
@Spy List<String> enemies = new ArrayList<>();
@InjectMocks Game game;
@Test public void attackWithSwordTest() throws Exception {
Mockito.when(player.getWeapon()).thenReturn("Sword");
enemies.add("Dragon");
enemies.add("Orc");
assertEquals(2, game.numberOfEnemies());
assertEquals("Player attack with: Sword", game.attack());
}
}
class Game {
private Player player;
private List<String> opponents;
public Game(Player player, List<String> opponents) {
this.player = player;
this.opponents = opponents;
}
public int numberOfEnemies() {
return opponents.size();
}
// ...
그건 모키토가 체크할 것이기 때문이다.Type Signature
게임 클래스의Player
그리고.List<String>
.
테스트 클래스에서 테스트된 클래스에 주석을 붙여야 합니다.@InjectMocks
그러면 Mockito에게 모크를 주입할 클래스가 표시됩니다.
@InjectMocks
private SomeManager someManager;
이후 클래스 내의 특정 메서드 또는 개체를 지정할 수 있습니다(이 경우).SomeManager
는 다음과 같이 mock으로 대체됩니다.
@Mock
private SomeDependency someDependency;
이 예에서는,SomeDependency
내부SomeManager
클래스가 조롱당합니다.
@Mock
주석을 지정하면 해당 객체가 모킹됩니다.
@InjectMocks
주석은 기본 객체에 의해 생성된 다양한 (및 관련성이 있는) 모크를 주입할 수 있도록 합니다.@Mock
.
둘 다 보완적입니다.
- @Mock은 필요한 클래스에 대한 모의 구현을 만듭니다.
- @InjectMock은 클래스의 인스턴스를 만들고 @Mock이라는 주석이 표시된 mock을 클래스에 주입합니다.
예를들면
@Mock
StudentDao studentDao;
@InjectMocks
StudentService service;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
서비스 클래스에는 DAO 클래스가 필요합니다.따라서 이를 조롱하고 서비스 클래스 인스턴스에 주입합니다.마찬가지로 스프링 프레임워크에서는 모든 @Autowired 콩을 jUnits의 @Mock에 의해 조롱당하고 @InjectMocks를 통해 콩에 주입할 수 있습니다.
MockitoAnnotations.initMocks(this)
method는 이러한 mock을 초기화하고 모든 테스트 방법에 대해 그것들을 주입하기 위해 호출할 필요가 있습니다.setUp()
방법.
이 링크는 Mockito 프레임워크에 대한 좋은 튜토리얼을 제공합니다.
Mockito가 기반으로 하는 "mocking framework"는 Mock 오브젝트를 작성하는 기능을 제공하는 프레임워크입니다(옛말로는 이러한 오브젝트는 종속 기능을 위한 션트로 기능하기 때문에 션트라고 불릴 수 있었습니다). 즉, mock 오브젝트는 코드가 의존하는 실제 오브젝트를 모방하기 위해 사용됩니다.즉, mo를 사용하여 프록시 오브젝트를 만듭니다.cking 프레임워크테스트에서 모의 객체를 사용함으로써 기본적으로 일반 유닛 테스트에서 통합 테스트로 이행합니다.
Mockito는 MIT 라이선스에 따라 출시된 Java용 오픈 소스 테스트 프레임워크로 깨끗하고 간단한 API로 아름다운 테스트를 작성할 수 있는 "mocking 프레임워크"입니다.Java 공간에는 많은 다른 모킹 프레임워크가 있지만, 기본적으로 두 가지 유형의 모킹 오브젝트 프레임워크가 있습니다. 하나는 프록시를 통해 구현되고 다른 하나는 클래스 재매핑을 통해 구현됩니다.
Spring과 같은 의존성 주입 프레임워크에서는 코드를 변경하지 않고 프록시 개체를 주입할 수 있습니다.모크 개체는 특정 메서드가 호출될 것으로 예상하며 예상된 결과를 반환합니다.
@InjectMocks
하고 "이러면 안 돼요"라는 필드를 삽입합니다.@Mock
★★★★★★★★★★★★★★★★★」@Spy
이치노
MockitoAnnotations.initMocks(this)
, 「 」의 「 」에 것을 말아 .따라서, 이 기능은, 다음의 URL 에 있는 것을 잊지 말아 주세요.@Before
@BeforeMethod
석입니니다다
@Tom에서 언급한 접근방식을 통해 얻을 수 있는 장점 중 하나는 SomeManager에서 컨스트럭터를 생성할 필요가 없기 때문에 클라이언트가 이를 인스턴스화하도록 제한할 수 있다는 것입니다.
@RunWith(MockitoJUnitRunner.class)
public class SomeManagerTest {
@InjectMocks
private SomeManager someManager;
@Mock
private SomeDependency someDependency; // this will be injected into someManager
//You don't need to instantiate the SomeManager with default contructor at all
//SomeManager someManager = new SomeManager();
//Or SomeManager someManager = new SomeManager(someDependency);
//tests...
}
이것이 좋은 프랙티스인지 아닌지는 애플리케이션 설계에 따라 달라집니다.
@Mock
를 선언할 때 합니다.@InjectMocks
테스트 작성 대상 콩을 조롱하기 위해 사용합니다.
예를 들어 다음과 같습니다.
public class A{
public class B b;
public void doSomething(){
}
}
A
:
public class TestClassA{
@Mocks
public class B b;
@InjectMocks
public class A a;
@Test
public testDoSomething(){
}
}
위의 답변이 포함되었지만, 저는 단지 부족한 세부사항을 추가하려고 했을 뿐입니다.그 뒤에 있는 이유(The Why).
일러스트:
Sample.java
---------------
public class Sample{
DependencyOne dependencyOne;
DependencyTwo dependencyTwo;
public SampleResponse methodOfSample(){
dependencyOne.methodOne();
dependencyTwo.methodTwo();
...
return sampleResponse;
}
}
SampleTest.java
-----------------------
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassA.class})
public class SampleTest{
@InjectMocks
Sample sample;
@Mock
DependencyOne dependencyOne;
@Mock
DependencyTwo dependencyTwo;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
public void sampleMethod1_Test(){
//Arrange the dependencies
DependencyResponse dependencyOneResponse = Mock(sampleResponse.class);
Mockito.doReturn(dependencyOneResponse).when(dependencyOne).methodOne();
DependencyResponse dependencyTwoResponse = Mock(sampleResponse.class);
Mockito.doReturn(dependencyOneResponse).when(dependencyTwo).methodTwo();
//call the method to be tested
SampleResponse sampleResponse = sample.methodOfSample()
//Assert
<assert the SampleResponse here>
}
}
@InjectMocks 주석을 사용하여 모의 필드를 테스트 개체에 자동으로 주입할 수 있습니다.
다음 예에서는 @InjectMocks를 사용하여 dataLibrary에 모의 데이터 맵을 주입했습니다.
@Mock
Map<String, String> dataMap ;
@InjectMocks
DataLibrary dataLibrary = new DataLibrary();
@Test
public void whenUseInjectMocksAnnotation_() {
Mockito.when(dataMap .get("aData")).thenReturn("aMeaning");
assertEquals("aMeaning", dataLibrary .getMeaning("aData"));
}
.@Mock
»@InjectMocks
, 는 꼭 될 될 것@InjectMocks
.
자세한 내용은 https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/를 참조해 주세요.
「 」는, 「 」라고 하는 에 주의해 주세요.@InjectMocks
이제 곧 폐지될 것이다
Mockito 3/4에서 @InjectMocks 및 삭제 일정을 사용하지 않음
@avp answer 및 link on:
필드에 InjectMocks 주석을 사용하지 않는 이유
언급URL : https://stackoverflow.com/questions/16467685/difference-between-mock-and-injectmocks
'programing' 카테고리의 다른 글
Vuex 상태 및 vue-router (0) | 2022.08.02 |
---|---|
vue.js에서는 "앱 초기화" 코드를 어디에 배치할 수 있습니까? (0) | 2022.08.02 |
입력 검증: 기본 오류 메시지 변경 (0) | 2022.08.02 |
OpenMP:지역 변수를 자동으로 개인적인 거? (0) | 2022.08.02 |
Vue.js: 생산성을 높이기 위해 먼저 스크립트 또는 템플릿을 단일 파일 컴포넌트에 넣어야 합니까? (0) | 2022.08.02 |