Mockito框架中的@Mock
和@InjectMocks
有什么不同?
发布于 2013-05-10 01:46:20
@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...
}
发布于 2017-10-13 18:19:54
这是一个关于@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
方法模拟一个Player类及其行为。最后,使用@InjectMocks
Mockito会将该Player
放入Game
。
请注意,您甚至不必创建new Game
对象。莫基托会给你注射的。
// you don't have to do this
Game game = new Game(player);
我们还将使用@Spy
注释获得相同的行为。即使属性名称不同也是如此。
@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();
}
// ...
这是因为Mockito将检查游戏类的Type Signature
,即Player
和List<String>
。
发布于 2016-03-07 00:03:58
在您的测试类中,测试的类应该使用@InjectMocks
进行注释。这告诉Mockito将mock注入到哪个类中:
@InjectMocks
private SomeManager someManager;
从那时起,我们可以指定类中的哪些特定方法或对象,在本例中为SomeManager
,将替换为模拟:
@Mock
private SomeDependency someDependency;
在本例中,SomeManager
类中的SomeDependency
将被模拟。
https://stackoverflow.com/questions/16467685
复制相似问题