当前位置: 首页 > 知识库问答 >
问题:

莫基托吞噬了堆栈痕迹?

凌轶
2023-03-14

为什么Mockito会吞噬堆栈痕迹?例如,如果我有一个

public class Foo
{
    public void foo()
    {
        bar();
    }

    public void bar()
    {
        baz();
    }

    public void baz()
    {
        throw new RuntimeException();
    }
}

和一个测试,例如

public class MockTest
{
    @Test
    public void test()
    {
        Mockito.spy(new Foo()).foo();
    }
}

抛出的异常看起来总是

java.lang.RuntimeException
    at Foo.baz(Foo.java:17)
    at MockTest.test(MockTest.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Foo.baz(Foo.java:17)
MockTest.test(MockTest.java:11)

(这里提供的示例只是一个简化--我要处理更多的间接、类等等。我不能让Mockito吞噬部分模拟堆栈跟踪的关键部分……)

共有1个答案

闾丘才哲
2023-03-14

是的,摩基托清理堆栈痕迹!

工作中的代码片段stacktracefilter

有不同的方法可以禁用

>

  • 从Mockito 1.10.10开始,通过Mockito扩展机制提供您自己的StackTraceCleanerProvider(创建一个资源文件mockito-extensions/org.Mockito.plugins.StackTraceCleanerProvider,使用实现的限定名)

    在自定义的imockitoConfiguration中重写CleansStackTrace方法,查看该方法以获取更多信息。

  •  类似资料:
    • 我对莫基托有疑问。我想测试这个简单的类: 我写了这个简单的测试: 此测试运行时没有错误。我等待它没有编译,因为没有任何对userService方法的调用…

    • Mockito似乎是一个非常好的Java存根/模拟框架。唯一的问题是我找不到任何关于使用API的最佳方法的具体文档。测试中使用的常用方法包括: 当您在实践中看到Mockito的示例时,您会看到如下代码: 从我读过的所有文档中,我已经识别了几个Mockito“语法”的“模式”,这些“语法”是通过将这些方法调用像上面的示例一样链接在一起而获得的。我发现的一些常见模式有: 当/然后:当(你的方法())。

    • Mockito——我知道间谍在对象上调用实际方法,而模拟在双对象上调用方法。此外,除非有代码气味,否则要避免间谍。然而,间谍是如何工作的?我应该在什么时候使用他们?它们与模拟有什么不同?

    • 我努力嘲笑一个华丽的存储库。以下是实体: 简单存储库: 这是资源: 和一个简单的测试,我尝试模拟存储库: 测试失败,因为响应列表是

    • 问题内容: 有以下代码: 并有输出: 为什么它打印八次而不是“ y”。遇到Java 时如何调用? 问题答案: 在这里您正在捉住,而不是在这种情况下您的程序会崩溃。 如果您尝试此代码(修改为添加静态计数器) 输出量 因此,它已进行了6869次(不同运行次数的更改),并打印了最后一个值。如果您只是像以前那样打印,则可能是输出被缓冲而不被刷新,因为它不是。 更新资料 在内部调用该缓冲。您不会丢失缓冲区中

    • 我正在做一个研究项目,我在谷歌云平台上安装了一个完整的数据分析管道。我们使用Spark上的HyperLogLog实时估计每个URL的唯一访问者。我使用Dataproc来设置Spark集群。这项工作的一个目标是根据集群大小来度量体系结构的吞吐量。Spark集群有三个节点(最小配置) 使用Java编写的数据生成器模拟数据流,其中我使用了kafka producer API。体系结构如下所示: 我用一个