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测试最容易实现的事情。测试通常遵循相同的实现模式,即使用通用方法进行抽象测试,使用相应的方法进行自定义实现