首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@Mock和@InjectMocks的区别

@Mock和@InjectMocks的区别
EN

Stack Overflow用户
提问于 2013-05-10 01:33:31
回答 12查看 388.2K关注 0票数 601

Mockito框架中的@Mock@InjectMocks有什么不同?

EN

回答 12

Stack Overflow用户

发布于 2013-05-10 01:46:20

@Mock创建了一个模拟。@InjectMocks创建类的一个实例,并将使用@Mock (或@Spy)注释创建的模拟注入到该实例中。

注您必须使用@RunWith(MockitoJUnitRunner.class)Mockito.initMocks(this)来初始化这些模拟并注入它们(JUnit 4)。

对于JUnit 5,您必须使用@ExtendWith(MockitoExtension.class)

代码语言:javascript
运行
复制
@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...

}
票数 726
EN

Stack Overflow用户

发布于 2017-10-13 18:19:54

这是一个关于@Mock@InjectMocks如何工作的示例代码。

假设我们有GamePlayer类。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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将使用whenthenReturn方法模拟一个Player类及其行为。最后,使用@InjectMocks Mockito会将该Player放入Game

请注意,您甚至不必创建new Game对象。莫基托会给你注射的。

代码语言:javascript
运行
复制
// you don't have to do this
Game game = new Game(player);

我们还将使用@Spy注释获得相同的行为。即使属性名称不同也是如此。

代码语言:javascript
运行
复制
@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,即PlayerList<String>

票数 363
EN

Stack Overflow用户

发布于 2016-03-07 00:03:58

在您的测试类中,测试的类应该使用@InjectMocks进行注释。这告诉Mockito将mock注入到哪个类中:

代码语言:javascript
运行
复制
@InjectMocks
private SomeManager someManager;

从那时起,我们可以指定类中的哪些特定方法或对象,在本例中为SomeManager,将替换为模拟:

代码语言:javascript
运行
复制
@Mock
private SomeDependency someDependency;

在本例中,SomeManager类中的SomeDependency将被模拟。

票数 87
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16467685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档