Junit 我用mockito错了吗?

Junit 我用mockito错了吗?,junit,mockito,Junit,Mockito,我写了这个测试: @Test public void testDistance() { World world = mock(World.class); AbstractWarp warp = mock(AbstractWarp.class); Location loc = new Location(world, 0, 0, 0); when(warp.getLocation()).thenReturn(loc); Player player = mo

我写了这个测试:

@Test
public void testDistance() {
    World world = mock(World.class);

    AbstractWarp warp = mock(AbstractWarp.class);
    Location loc = new Location(world, 0, 0, 0);
    when(warp.getLocation()).thenReturn(loc);

    Player player = mock(Player.class);
    Location loc2 = new Location(world, 100, 0, 0);
    when(player.getLocation()).thenReturn(loc2);

    double expected = 100;
    double actual = warp.distance(player);

    verify(player).getLocation();
    verify(warp).getLocation();
    assertEquals(expected, loc.distance(loc2), .1);
    assertEquals(expected, actual, .1);
}
对于AbstractWarp类中的此方法:

public double distance(Player player) {
    return player.getLocation().distance(getLocation());
}
我不明白为什么第一次验证失败,跟踪如下:

Wanted but not invoked:
player.getLocation();
-> at paperwarp.domain.AbstractWarpTest.testDistance(AbstractWarpTest.java:36)
Actually, there were zero interactions with this mock.

我做错了什么?

你做错的是你为AbstractWarp创建了一个模拟,因此你的
AbstractWarp.distance的实际实现从来没有被调用过

AbstractWarp
需要的是
spy
而不是像这样的
mock

AbstractWarp warp = spy(new AbstractWarp()); //instead of new AbstractWarp() use whatever other initialization is appropriate
doReturn(loc).when(warp).getLocation();

注意,如果您实际上不打算调用
AbstractWarp.getLocation
,那么
AbstractWarp
根本不需要
spy
。一个普通的类会做得很好

我想说,他实际上是在嘲笑被测的
,所以在你身上没有多少“真正的测试”。但是AbstractWarp是一个抽象类,我不能创建它的实例。我应该使用一个从它扩展而来的匿名类吗?@Aeron这是doMy测试最容易实现的事情。测试通常遵循相同的实现模式,即使用通用方法进行抽象测试,使用相应的方法进行自定义实现