我正在使用 mockito 进行练习,但我对如何测试依赖于本地对象中的方法调用的方法有点困惑。请参见以下示例:
public class Worker {
public void work() {
Vodka vodka = new Vodka();
vodka.drink();
}
}
这个工人,他不做他的工作,他喜欢喝酒。但是我想添加一个测试来证明他在工作时喝酒。但是没有办法这样做,因为我必须在调用方法 work 时验证方法 drink() 是否被调用。我想你同意我的观点,这是不可能测试的,所以我需要在开始测试之前打破依赖关系。这是我的第一个疑问,您认为打破这种依赖的最佳方法是什么?如果我只是将伏特加对象的范围更改为全局,我认为不会很好(我不想将它暴露给班级的其他部分)。我想过创建一个工厂,如下所示:
public class Worker {
private VodkaFactory vodkaFactory = new VodkaFactory();
public void work() {
Vodka vodka = vodkaFactory.getVodka();
vodka.drink();
}
}
我不确定我是否正确地打破了依赖关系,但我现在想做的是测试在执行 work() 时是否调用了方法 drink()。我试过这个没有运气:
@Test
public void
does_the_worker_drink_while_working
() {
VodkaFactory vodkaFactory = mock(VodkaFactory.class);
Vodka vodka = mock(Vodka.class);
Worker worker = new Worker();
worker.work();
when(vodkaFactory.getVodka()).thenReturn(vodka);
verify(vodka,times(1)).drink();
}
我模拟了工厂,何时会检测到工厂创建了一个新的伏特加对象。但是当我验证该方法调用了 1 次方法drink() 时,mockito 告诉我:
Wanted but not invoked:
vodka.drink();
-> at testing_void_methods_from_local_objects.WorkerSpecification.does_the_worker_drink_while_working(WorkerSpecification.java:22)
Actually, there were zero interactions with this mock.
我没有正确存根,或者我做错了什么。你能帮我完成这个测试,并澄清一下测试这些无法测试的方法的最佳方法是什么?
我知道 mockito 有一个名为 doAnswer() 的方法,它用于模拟方法调用,你认为它在这种情况下有用吗?我应该如何使用它?
更新:
我正在按照建议在 thewhen()
之前获取调用,work()
并且我正在尝试允许从类外部设置工厂:
@Test
public void
does_the_worker_drink_while_working
() {
VodkaFactory vodkaFactory = mock(VodkaFactory.class);
Vodka vodka = mock(Vodka.class);
Worker worker = new Worker();
when(vodkaFactory.getVodka()).thenReturn(vodka);
worker.work();
verify(vodka,times(1)).drink();
}
这是现在的生产代码:
public class Worker {
private VodkaFactory vodkaFactory;
public void work() {
Vodka vodka = vodkaFactory.getVodka();
vodka.drink();
}
public void setVodkaFactory(VodkaFactory vodkaFactory) {
this.vodkaFactory = vodkaFactory;
}
我得到的例外如下:
java.lang.NullPointerException
at testing_void_methods_called_from_local_objects.Worker.work(Worker.java:9)
这是说vodka.drink()
抱歉,我仍然对问题所在感到困惑。