Mockito - doReturn() 和 when() 之间的区别

2022-08-31 05:21:12

我目前正在使用Mockito在Spring MVC应用程序中模拟我的服务层对象,我想在其中测试我的控制器方法。但是,正如我一直在阅读Mockito的细节一样,我发现这些方法等效于。所以,我的问题是,有两种方法可以做同样的事情有什么意义,或者和之间的细微区别是什么?doReturn(...).when(...)when(...).thenReturn(...)doReturn(...).when(...)when(...).thenReturn(...)

任何帮助将不胜感激。


答案 1

用于存根的两种语法大致等效。但是,您始终可以用于存根;但在某些情况下,您不能使用 .Stubbing void方法就是这样一种。其他包括与Mockito间谍一起使用,并多次使用相同的方法。doReturn/whenwhen/thenReturn

有一件事没有给你,那就是在编译时对你返回的值进行类型检查。但是,我认为这几乎没有价值 - 如果你的类型错误,你会在运行测试后立即发现。when/thenReturndoReturn/when

我强烈建议只使用.学习两种语法是没有意义的,当一个人会这样做的时候。doReturn/when

您可能希望参考我在Forming Mockito“语法”中的答案 - 对一个非常密切相关的问题的更详细的答案。


答案 2

如果使用 spied 对象(用 注释)而不是 mock(用 注释符),则两种方法的行为会有所不同:@Spy@Mock

  • when(...) thenReturn(...) 在返回指定值之前进行实际方法调用。因此,如果调用的方法抛出异常,则必须处理它/模拟它等。当然,您仍然可以获得结果(您在thenReturn(...))

  • doReturn(...) when(...) 根本不调用该方法

例:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

测试:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

推荐