2013-07-27 247 views
1

我有一個參數化測試用例,就像我在測試套件中的一堆其他測試用例一樣,我一直在試圖添加它們。Maven JUnit測試用例測試類NoClassDefFoundException

package com.example; 

import com.google.gson.Gson; 
import com.example.Event; 
import com.example.LocalStorage; 
import com.example.TimeMachine; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.Parameterized.Parameters; 

import java.util.Arrays; 
import java.util.Collection; 

import static org.fest.assertions.api.Assertions.assertThat; 
import static org.mockito.Mockito.mock; 

@RunWith(Parameterized.class) 
public class TimeMachineEventEndTimeTest { 

    public TimeMachineEventEndTimeTest(Event event, String end_time) { 
     _event = event; 
     _end_time = end_time; 
    } 

    @Parameters 
    public static Collection<Object[]> data() { 
     return Arrays.asList(new Object[][]{ 
      { _UNSCHEDULED, "" }, 
      { _NOON_FOR_1_HOUR, "13:00" }, 
      { _NOON_FOR_HALF_HOUR, "12:30" }, 
      { _MIDNIGHT_FOR_1_HOUR, "1:00" }, 
      { _MIDNIGHT_FOR_HALF_HOUR, "0:30" }, 
      { _MIDNIGHT_FOR_12_HOUR, "12:00" } 
     }); 
    } 

    @Before 
    public void initialize() throws Exception { 
     _time_machine = new _TimeMachine(); 
    } 

    @Test 
    public void testEndTimeForEvent() throws Exception { 
     assertThat(_time_machine.endTimeForEvent(_event)).isEqualTo(_end_time); 
    } 

    private TimeMachine _time_machine; 
    private final Event _event; 
    private final String _end_time; 
    private static final Gson _gson = new _GsonProvider(mock(LocalStorage.class)).gson(); 
    private static final Event _UNSCHEDULED = _gson.fromJson("{}", Event.class); 
    private static final Event _NOON_FOR_1_HOUR = _gson.fromJson("{\n" + 
     "  \"starttime\" : \"12:00\",\n" + 
     "  \"duration\" : \"60\",\n" + 
     " }", Event.class); 
    private static final Event _NOON_FOR_HALF_HOUR = _gson.fromJson("{\n" + 
     "  \"starttime\" : \"12:00\",\n" + 
     "  \"duration\" : \"30\",\n" + 
     " }", Event.class); 
    private static final Event _MIDNIGHT_FOR_1_HOUR = _gson.fromJson("{\n" + 
     "  \"starttime\" : \"0:00\",\n" + 
     "  \"duration\" : \"60\",\n" + 
     " }", Event.class); 
    private static final Event _MIDNIGHT_FOR_HALF_HOUR = _gson.fromJson("{\n" + 
     "  \"starttime\" : \"0:00\",\n" + 
     "  \"duration\" : \"30\",\n" + 
     " }", Event.class); 
    private static final Event _MIDNIGHT_FOR_12_HOUR = _gson.fromJson("{\n" + 
     "  \"starttime\" : \"0:00\",\n" + 
     "  \"duration\" : \"360\",\n" + 
     " }", Event.class); 
} 

我有幾個測試用例幾乎相同的結構,在同一個目錄和包中測試不同的方法。我所有的其他測試運行,並通過100%,除了這個測試用例拋出該堆棧跟蹤:

java.lang.NoClassDefFoundError: Could not initialize class com.example.TimeMachineEventEndTimeTest at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:186) at org.apache.maven.surefire.report.SmartStackTraceParser.getClass(SmartStackTraceParser.java:63) at org.apache.maven.surefire.report.SmartStackTraceParser.(SmartStackTraceParser.java:53) at org.apache.maven.surefire.common.junit4.JUnit4StackTraceWriter.smartTrimmedStackTrace(JUnit4StackTraceWriter.java:72) at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:328) at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:312) at org.apache.maven.surefire.booter.ForkingRunListener.toString(ForkingRunListener.java:258) at org.apache.maven.surefire.booter.ForkingRunListener.testError(ForkingRunListener.java:131) at org.apache.maven.surefire.common.junit4.JUnit4RunListener.testFailure(JUnit4RunListener.java:111) at org.junit.runner.notification.RunNotifier$4.notifyListener(RunNotifier.java:100) at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:41) at org.junit.runner.notification.RunNotifier.fireTestFailure(RunNotifier.java:97) at org.junit.internal.runners.ErrorReportingRunner.runCause(ErrorReportingRunner.java:57) at org.junit.internal.runners.ErrorReportingRunner.run(ErrorReportingRunner.java:34) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)

回答

0

如果有其他人遇到類似的問題,對我來說這似乎是我最後幾行創建一些Event s。他們在JSON中有一個小錯誤,在構建它們時必須導致Gson錯誤。

private static final Event _NOON_FOR_1_HOUR = _gson.fromJson("{\n" + 
    "  \"starttime\" : \"12:00\",\n" + 
    "  \"duration\" : \"60\"\n" + 
    " }", Event.class); 
private static final Event _NOON_FOR_HALF_HOUR = _gson.fromJson("{\n" + 
    "  \"starttime\" : \"12:00\",\n" + 
    "  \"duration\" : \"30\"\n" + 
    " }", Event.class); 
private static final Event _MIDNIGHT_FOR_1_HOUR = _gson.fromJson("{\n" + 
    "  \"starttime\" : \"0:00\",\n" + 
    "  \"duration\" : \"60\"\n" + 
    " }", Event.class); 
private static final Event _MIDNIGHT_FOR_HALF_HOUR = _gson.fromJson("{\n" + 
    "  \"starttime\" : \"0:00\",\n" + 
    "  \"duration\" : \"30\"\n" + 
    " }", Event.class); 
private static final Event _MIDNIGHT_FOR_12_HOUR = _gson.fromJson("{\n" + 
    "  \"starttime\" : \"0:00\",\n" + 
    "  \"duration\" : \"360\"\n" + 
    " }", Event.class); 

更正是在「持續時間」值後面刪除「,」。看來這個棧跟蹤非常神祕而且很具誤導性。

1

你能運行從IDE的考驗嗎?它看起來像堆棧跟蹤誤導因爲https://jira.codehaus.org/browse/SUREFIRE-962

這將是有益的,如果你可以提供一個可運行的要點,重現問題。

+0

這是來自Android Studio IDE。我共享的代碼是造成問題的代碼的100%。我不確定你在問什麼。 –

+0

有一個完整的項目,我可以稱之爲mvn測試。 –

+0

我發現誤導性的堆棧跟蹤意味着什麼,感謝您的嘗試。 –