解密堆栈跟踪,注入大量JUnit

时间:2016-01-03 06:13:38

标签: java junit stack-trace

请注意,这不是this的重复。

我一直在编写一些作为JUnit运行的代码。我阅读了上面链接的线程,它讨论了堆栈跟踪中错误的位置通常如何最接近底部。但是,因为我的代码是作为JUnit测试运行的,所以堆栈跟踪注入了很多我认为代码作为单元测试运行的结果, 所以错误不能是直接跟踪到堆栈跟踪的底部,就像上面的帖子所说 (< - 为什么它不是重复的)。

以下是运行代码后得到的堆栈跟踪。

java.lang.NullPointerException
    at API.ItemFetcher.<init>(ItemFetcher.java:39)
    at API.MarketConstants.<clinit>(MarketConstants.java:24)
    at API.ItemFetcher.setOtherMonetaryValues(ItemFetcher.java:153)
    at API.ItemFetcher.<init>(ItemFetcher.java:53)
    at Tests.Tests.test(Tests.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我的代码结构如下

-src
  -API
    -Item.java
    -ItemFetcher.java
    -MarketConstants.java
    -IrrelevantFolder
  -Tests
    -Tests.java

我应该在哪里查看基于堆栈跟踪的代码以查找错误?由于堆栈跟踪中的所有JUnit内容,我不能100%确定要查找的位置。就像我之前说的那样,我已经阅读了其他SO线程,但之前没有涉及过。

2 个答案:

答案 0 :(得分:3)

如果查看堆栈跟踪中的根本原因,它会指出NullPointerException发生at API.ItemFetcher.<init>(ItemFetcher.java:39)。这意味着在第39行,在ItemFetcher类内,发生了NullPointerException

请记住,JUnit只是调用您现有的类/方法。因此,请始终查找代码在堆栈跟踪中的位置。

答案 1 :(得分:0)

堆栈跟踪是一个强大的工具,您引用的post提供了有关如何使用它的非常好的建议。

但堆栈跟踪只是 一个“工具”。 必须做这项工作。你必须从逻辑上认为

一定不能说废话,比如“line'PallFetcher.java:xyz'总是习惯工作,所以它不可能成为问题”。那是我投票给你的时候;)你已经删除了那句话(谢谢!),我已经撤回了我的投票。

以下是我解决问题的方法:

  1. 是的,你的追溯中有很多“JUnit”的东西。

    问:JUnit如何导致问题?

    答:可能不能。就像RamV13(正确!)指出的那样,“请记住,JUnit只是调用你现有的类/方法。所以总是寻找代码在堆栈跟踪中的位置”。

    因此,对于初学者,我会在代码中查看其他,并忽略JUnit行。

  2. 正如RamV13也指出的那样,“ItemFetcher.java:39”是“你的代码”开始的地方。这绝对是一个开始寻找的好地方。

  3. 问:你在寻找什么

    答:如果你有一个“DivideByZero”错误,你会找到一个可能评估为“0”分母的算术表达式。如果您有“IOException”,那么您将寻找“open()”,“read()”或“write()”。

    在这种情况下,你有一个“NullPointerException”。

    所以你正在寻找 AN UNINITIALIZED VARIABLE

  4. 问:什么变量?

  5. 最好看的地方是发生NullPointerException的确切行

    java.lang.NullPointerException
        at API.ItemFetcher.<init>(ItemFetcher.java:39) 
        <-- Your problem is an uninitialized variable at line 39!
    
    1. 问:为什么没有初始化?
    2. 这是你要弄明白的。在代码中向后看(甚至可以追溯到ItemFetcher.java:39)并查看的初始化位置。

      然后解决它:)

      '希望有所帮助!