Spring Boot 2异常堆栈跟踪不完整

时间:2018-10-18 03:29:30

标签: java spring spring-boot

Spring boot 2报告测试中的异常与v1不同。

使用Spring Boot 1.5.18的Stacktrace报告

Running com.test.v1.TestStacktrace
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.003 sec <<< FAILURE! - in com.test.v1.TestStacktrace
test(com.test.v1.TestStacktrace)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.NullPointerException: null
  at com.test.v1.Util.willThrowException(Util.java:15)
  at com.test.v1.TestStacktrace.test(TestStacktrace.java:20)

使用v1,您可以获得整个堆栈跟踪信息,从实际上引发异常的行开始Util.willThrowException(Util.java:15)

使用Spring Boot 2.0.6的Stacktrace报告

Running com.test.v2.TestStacktrace
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.022 s <<< FAILURE! - in com.test.v2.TestStacktrace
test(com.test.v2.TestStacktrace)  Time elapsed: 0.006 s  <<< ERROR!
java.lang.NullPointerException
   at com.test.v2.TestStacktrace.test(TestStacktrace.java:20)

对于v2,您只会得到TestStacktrace.java:20,这是异常stacktrace中的最后一行。如果stacktrace具有5种方法级别,则只有最后一个调用者才能花费更多时间来确定根本原因。

有人知道要解决此问题的人吗?可以采取什么步骤来获得与版本1相同的异常报告?

更新:这就是TestStacktrace.java文件的外观

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.test.v1;

import junit.framework.TestCase;
import org.junit.Test;

/**
 *
 * @author Jhovanni <jhovanni@github.com>
 */
public class TestStacktrace extends TestCase {

    @Test
    public void test() {
        Util util = new Util();
        util.willThrowException(null);
    }
}

Util.java仅包含一个静态方法,该静态方法在被调用时会直接引发异常。 TestStacktrace.java v1 / v2几乎相同,只是更改了程序包名称。这两个项目都是最近使用spring initializr创建的,唯一的区别(除了软件包名称)是pom.xml中的spring boot父版本。

2 个答案:

答案 0 :(得分:0)

这与IDE有关,与spring项目无关。问题可以结束。

答案 1 :(得分:0)

看一下测试,我发现您使用的是 JUnit 3 样式:

public class TestStacktrace extends TestCase

JUnit 4 不再符合将测试类设为TestCase子类的JUnit 3要求。您应该使用@Test批注来表示测试:

public class TestStacktrace {

    @Test
    public void test() {
        ...
    }
}

请注意,要测试Spring Boot应用程序,唯一需要的依赖项是此Starter:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

它包括JUnit,有关更多详细信息,请参见here