有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java More Mockito返回\u DEEP\u STUBS悲哀

我最近阅读并使用了下面链接的GitHub Repo中的一些示例,它用于扩展基本的Spring引导错误对象。我正试图为ApiError.java类编写一些测试,尤其是#addValidationErrors

https://github.com/brunocleite/spring-boot-exception-handling/blob/master/src/main/java/com/example/springbootexceptionhandling/ApiError.java

基本的问题是,我还没有找到一种方法来获得方法的链接以返回值。我在这一点上的测试看起来像这样

@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) 个答案

  1. # 1 楼答案

    你的语法是正确的,但是你的具体问题是getRootBeanClass返回一个Class,Mockito不能模拟final类。在后台,当您要求模拟一个类时,Mockito生成一个子类,该子类(有效地)覆盖所有方法,并将它们重定向到Mockito控件。这种覆盖机制就是为什么你很难模拟final方法,以及final类,比如java.lang.Class

    虽然您可以使用PowerMock完成这项工作,但这是不可取的,如2011年的Johan Haleby's post from powermock@googlegroups.com

    I don't think there's a possibility to mock Class because that will mess up a lot of PowerMock internal stuff. You can how ever mock the "getClass()" method of Objects if you set MockGateway.MOCK_GET_CLASS_METHOD = true.

    I would strongly advice [sic] against mocking Class or getClass method though. Try to verify it in some other way.

    因为你只关心让^ {CD6>}返回一个可预测的值,考虑创建一个新的类(“MyBean”),并设置^ {CD7>}来返回它。在接口上模拟返回值将非常容易,您将获得与您希望使用的相同类型的简单名称返回值