java More Mockito返回\u DEEP\u STUBS悲哀
我最近阅读并使用了下面链接的GitHub Repo中的一些示例,它用于扩展基本的Spring引导错误对象。我正试图为ApiError.java
类编写一些测试,尤其是#addValidationErrors
基本的问题是,我还没有找到一种方法来获得方法的链接以返回值。我在这一点上的测试看起来像这样
@Test
public void addValidationErrors() {
ApiError apiError = new ApiError(HttpStatus.OK);
ConstraintViolation mockViolation = Mockito.mock(ConstraintViolation.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(mockViolation.getRootBeanClass().getSimpleName()).thenReturn("MyBeanName");
...
此时,测试在调用Mockito.when
方法的行上以NullPointerException
结束。我尝试了不同的运行程序类(Mockito、JUnit4甚至PowerMock)以及各种注释组合,例如@PrepareForTest
,并在@Mock
下在测试之外声明mockViolation
# 1 楼答案
你的语法是正确的,但是你的具体问题是
getRootBeanClass
返回一个Class
,Mockito不能模拟final类。在后台,当您要求模拟一个类时,Mockito生成一个子类,该子类(有效地)覆盖所有方法,并将它们重定向到Mockito控件。这种覆盖机制就是为什么你很难模拟final
方法,以及final
类,比如java.lang.Class
虽然您可以使用PowerMock完成这项工作,但这是不可取的,如2011年的Johan Haleby's post from powermock@googlegroups.com:
因为你只关心让^ {CD6>}返回一个可预测的值,考虑创建一个新的类(“MyBean”),并设置^ {CD7>}来返回它。在接口上模拟返回值将非常容易,您将获得与您希望使用的相同类型的简单名称返回值