当前位置: 首页 > 知识库问答 >
问题:

Mockito:测试void方法会产生InvalidUseOfMatchersException

昌博易
2023-03-14

我遇到了问题,有两个不实的方法。在鼓励Ventures评分我已经按照这个答案嘲笑了一个数组列表,该数组列表将在for循环中循环,没有嘲笑列表,但传递了一个真实的列表并添加了被嘲笑的对象。

Mockito在这条线上给我一个InvalidUseOfMatchersException

验证(effectList.get(Mockito.anyInt())。执行(playerHandler)

关于这个例外,有很多关于SO的问题,我认为这是因为anyInt()。无论如何,我把它改成了

verify(effectList.get(0)).execute(playerHandler);

现在它说想要但没有调用effect.execute(playerHandler)实际上与这个mock没有任何交互

是因为我放了doNo吗?doNo().当(效果).执行(playerHandler);

在我的第二种方法军事强化评分()方法中,有没有办法跳过第一块代码并只测试if... ones条件?测试这种方法的最佳方法是什么?

谢谢你抽出时间。

这是要考的课

 public class EndGameScoringBaseController implements EndGameScoringHandler {

private static final int[] TERRITORIES_REWARD = {0,0,1,4,10,20};
private static final int[] CHARACTERS_REWARD = {1,3,6,10,15,21};
private static final int RESOURCES_RATE = 5;
private static final int FIRST_MILITARY_REWARD = 5;
private static final int SECOND_MILITARY_REWARD = 2;

private PlayerHandler player;

public EndGameScoringBaseController(PlayerHandler player) {
    super();
    this.player = player;
}

@Override
public void encouragedVenturesScoring() {
    for (DevelopmentCard card : player.getPlayer().getPersonalBoard().getVentures()) {
        for (Effect e : card.getPermanentEffects())
            e.execute(player);
    }
}

@Override
public void militaryStrengthScoring(GameController game) {
    Set<Integer> points = new HashSet<>();
    int myPoints = this.player.getPointsHandler().getMilitaryPoints();

    for (PlayerHandler p: game.getPlayers()) {
        points.add(p.getPointsHandler().getMilitaryPoints());
    }
    int[] rank = new int[points.size()];
    int j = 0;
    for (Integer i : points) {
        rank[j] = i;
        j++;
    }

    Arrays.sort(rank);

    if (rank[rank.length-1] == myPoints) {
        player.getPointsHandler().winMilitaryPoints(FIRST_MILITARY_REWARD);
    }
    else if (rank[rank.length-2] == myPoints) {
        player.getPointsHandler().winVictoryPoints(SECOND_MILITARY_REWARD);
    }

}

激励激励激励的测试方法

@Test
public void encouragedVenturesScoringTest() {
    //given
    List<DevelopmentCard> ventureList;
    ventureList = Arrays.asList(developmentCard, developmentCard);
    when(playerHandler.getPlayer().getPersonalBoard().getVentures()).thenReturn(ventureList);
    List<Effect> effectList;
    effectList = Arrays.asList(effect, effect);
    when(developmentCard.getPermanentEffects()).thenReturn(effectList);
    doNothing().when(effect).execute(playerHandler);

    //when
    endgameController.encouragedVenturesScoring();

    //then
    verify(effectList.get(Mockito.anyInt())).execute(playerHandler);
}

军事强化评分的不完全测试方法

@Test
public void militaryStrengthScoringTest() {

//given     
when(playerHandler.getPointsHandler().getMilitaryPoints()).thenReturn(4);
doNothing().when(playerHandler.getPointsHandler()).winMilitaryPoints(FIRST_MILITARY_REWARD);

//when
endgameController.militaryStrengthScoring(gameController);

//then
/../    
}

共有2个答案

彭英逸
2023-03-14

您只能验证由Mockito创建的模拟对象。

但是effectList是一个“真实”列表。因此Mockito对该对象一无所知。因此,任何验证该列表的尝试都必须失败。

如果你想验证这个对象,那么你必须模拟它!

当然,这意味着您已经指定了将进入模拟列表的所有调用

洪开诚
2023-03-14

你说得对,这就是问题所在:

verify(effectList.get(Mockito.anyInt())).execute(playerHandler);

由于匹配器的内部实现,Mockito只允许像any()anyInt()这样的调用来代替模拟本身的参数

/*  OK */  when(yourMock.yourMethod(anyInt())).thenReturn(42);
/* BAD */  when(yourList.get(anyInt()).yourMethod(0)).thenReturn(42);

/*  OK */  verify(yourMock).yourMethod(anyInt());
/* BAD */  verify(yourList.get(anyInt())).yourMethod(0);

get(0)的失败很可能是一个实际的失败,并且可能与您的鼓励的VenturesScoingTest实际上没有调用鼓励的VenturesScoing,而是调用影响的特征评分。如果在修复该错误后继续给您带来麻烦,以与Mockito相关的方式,请编辑您的问题。

 类似资料:
  • 问题内容: 我有一个带有返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? 问题答案: 括号放置不正确。 您需要使用: 而 不是 使用: 在文档中对此进行了解释

  • 我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?

  • 问题内容: 我有一个充满void方法的Java类,我想进行一些单元测试以获得最大的代码覆盖率。 例如我有这种方法: 它的名字不好用是因为我翻译了代码以更好地理解。每种方法均会验证参数是否在某种程度上有效并且编写正确。 范例: 我的单元测试很好地涵盖了小的方法,因为我要求它们检查ErrorFile是否包含错误消息,但是我看不到如何测试方法checkIfValidElements,它什么也不返回或什么

  • debug populate 测试利器,快速产生大量的key 127.0.0.1:6379> debug populate 10000 OK 127.0.0.1:6379> dbsize (integer) 10000

  • 我有以下代码 我对嘲笑不熟悉。我有以下疑问。我正在尝试测试公共方法。 我是否可以断言私有变量workDone的值? 是否可以验证超类中的方法调用? 如何在方法中模拟私有方法调用?