首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito RETURNS_DEEP_STUBS更多的灾难

Mockito RETURNS_DEEP_STUBS更多的灾难
EN

Stack Overflow用户
提问于 2017-10-23 22:31:51
回答 1查看 2.9K关注 0票数 2

最近,我阅读并使用了一些示例,如下面链接的GitHub Repo中所示,它用于扩展基本的对象。我试图为ApiError.java类编写一些测试,特别是#addValidationError

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

基本的问题是,我还没有找到一种方法来使方法链接来返回值。我现在的测试看起来是这样的..。

代码语言:javascript
复制
@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");
...

此时,测试将在调用NullPointerException方法的行上使用一个Mockito.when。我尝试过不同的运行器类(Mockito、JUnit4甚至PowerMock),以及各种注释组合,比如@PrepareForTest和在测试之外在@Mock下声明mockViolation。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-23 23:22:19

您的语法是正确的,但是这里您的具体问题是getRootBeanClass返回一个Class,而Mockito不能模拟最终的类。在幕后,当您请求模拟一个类时,Mockito生成一个子类,该子类(有效地)覆盖所有方法并将它们重定向到Mockito控件。这种覆盖机制将导致您在模拟final方法以及像java.lang.Class这样的final类时遇到困难。

虽然您可以使用PowerMock完成这一任务,但这是不可取的,就像2011年的Johan来自powermock@googlegroups.com的帖子那样:

我不认为有可能模拟类,因为这会使很多PowerMock内部的东西都搞砸了。如果您设置了getClass= true,那么您可以如何模拟对象的“MockGateway.MOCK_GET_CLASS_METHOD ()”方法。 不过,我强烈建议sic不要模仿类或getClass方法。试着用其他方法来验证它。

因为您只关心如何使getSimpleName返回一个可预测的值,所以可以考虑创建一个新的类("MyBean")并设置getRootBeanClass()来返回它。在接口上模拟返回值将非常容易,并且您将得到与您想要使用的相同类型的简单名称返回值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46899506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档