Eclipse中的jUnit抛出空指针异常

时间:2014-02-28 12:01:05

标签: java eclipse exception junit

我已经看过其他jUnit null点异常,但它们似乎都没有解决我遇到的问题。我正在使用Ubuntu 12.04运行Eclipse 4.3.1。

我已经使用Eclipse向导设置了一个jUnit类,并且我认为我已经完成了所有教程。代码是;

import static org.junit.Assert.*;

import java.util.concurrent.TimeUnit;
import java.io.IOException;

import org.openhab.action.videoanalytics.AwarenessTypes.*;
import org.junit.Test;

public class ThreeMinuteRun {

String cameraId = "cam1test";
String videoStream = "http://xxx.xxx.xxx.xxx/mjpg/video.mjpg"; //ip obfuscated for this online question
String format = "MJPG";
MotionDetectionType motionType= MotionDetectionType.basic;
AwarenessAnalytics AA = new AwarenessAnalytics();
String maskFilename = "/home/will/odev/MotionDetect/src/main/resources/DrivewayMaskWhite.png";
MotionDetectionState motionDetectionState = MotionDetectionState.on;
String directoryStore = "/media/PENDRIVE/alertImageTest/";

@Test
public void testSetVideoSource() {
    try {
        AA.setVideoSource(cameraId, videoStream, format, motionType);
    } catch (IOException e) {
        fail("IOException in setVideoSource");
    }
}

@Test
public void testAddListener() {
    AA.addListener(new DetectionListener());
}

@Test
public void testSetFramesToExaminePerSecond() {
    AA.setFramesToExaminePerSecond(cameraId, 1);
}

@Test
public void testSetMotionDetectionType() {
    AA.setMotionDetectionType(cameraId, motionType);
}

@Test
public void testSetImageStoreLocation() {
    AA.setImageStoreLocation(directoryStore);;
}

@Test
public void testSetsecsUntilMotionCeasedOption() {
    AA.setsecsUntilMotionCeasedOption(7);
}

@Test
public void testSetSizeSensitivity() {
    AA.setSizeSensitivity(cameraId, 4);
}

@Test
public void testSetDebugState() {
    AA.setDebugState(true, 10);
}

@Test
public void testSetMotionDetectionState() {
    AA.setMotionDetectionState(cameraId, motionDetectionState);
}

@Test
public void testSetLightFalseAlarmAdjustment() {
    AA.setLightFalseAlarmAdjustment(cameraId, 5);
}

@Test
public void testSetMaskImage() {
    AA.setMaskImage(cameraId, maskFilename);
}

@Test
public void testSetMaskState() {
    AA.setMaskState(cameraId, true);
}

@Test
public void testGetAlertImages() {
    fail("Not yet implemented");
}

@Test
public void testGetAlertVideo() {
    fail("Not yet implemented");
}

@Test
public void testStart() {
    AA.start();
    //then sleep for 3 minutes
    try {
        TimeUnit.SECONDS.sleep(360000);
    } catch (Exception e) {
        // Q. Should this be passed up or just ignored if it happens occasionally?
        //throw new IOException ("Sleep problem ", e);
        System.out.println(e);
    }
}

/**@Test
public void testRun() {
    fail("Not yet implemented");
}*/



@Test
public void testStop() {
    AA. stop();
}

}

我得到的错误消息相当简洁;

An internal error occurred during: "Launching ThreeMinuteRun (1)".
java.lang.NullPointerException

这三分钟的比赛变成了“3小时巡回赛”......

思想?

修改

我将setVideoSource前导码更改为@Before(尽管在大多数其他调用之前没有强制执行)并且我将开始前导码更改为@After, 要求视频源到先设定好。

@Before
public void testSetVideoSource() {
    try {
        AA.setVideoSource(cameraId, videoStream, format, motionType);
    } catch (IOException e) {
        fail("IOException in setVideoSource");
    }
}

@After
public void testStart() {
    AA.start();
    //then sleep for 3 minutes
    try {
        TimeUnit.SECONDS.sleep(360000);
    } catch (Exception e) {
        //throw new IOException ("Sleep problem ", e);
        System.out.println(e);
    }
}

我仍然得到同样的例外。

请注意:我有一个非jUnit测试驱动程序,目前工作正常,我正在努力提高我的技能(并添加纪律)

Analytics Awareness是一个基本的线程(目前为此),它为每个摄像头生成一个VideoAnalytics线程(此时只有一个正在测试)。组件集当前正在使用我的非jUnit驱动程序,提供了我现在需要的结果。

编辑2:

我只是重新运行我现有的非jUnit测试驱动程序,它仍然正常运行,AwarenessAnalytic类表现正常(当然有一些非异常逻辑错误可以解决)。

编辑3:

将testSetVideoSource方法更改为init,结果没有变化(仍然抛出空指针异常)。

@Before
public void init() {
    try {
        AA.setVideoSource(cameraId, videoStream, format, motionType);
    } catch (IOException e) {
        fail("IOException in setVideoSource");
    }
}

编辑4:

我从上面第一个测试的副本创建了一个更基本的测试,删除了以下所有测试过程;

@Before
public void init() {
    try {
        AA.setVideoSource(cameraId, videoStream, format, motionType);
    } catch (IOException e) {
        fail("IOException in setVideoSource");
    }
}

@Test
public void testAddListener() {
    AA.addListener(new DetectionListener());
}

@After
public void testStart() {
    AA.start();
    //then sleep for 3 minutes
    try {
        TimeUnit.SECONDS.sleep(360000);
    } catch (Exception e) {
        //throw new IOException ("Sleep problem ", e);
        System.out.println(e);
    }
}

我现在得到的错误消息实际上是相同的,尽管在JUnit测试类名之后没有“(1)”;

An internal error occurred during: "Launching ThreeMinuteRunSimple".
java.lang.NullPointerException

我刚尝试在Debug中运行它,也作为JUnit测试,在发生任何其他事情之前认为同样的异常发生。

思想?

3 个答案:

答案 0 :(得分:3)

一个常见的错误是你希望测试是在彼此之后运行的。每个测试都是完全独立的,所以不要指望来自其他测试的状态。

尝试将构造函数逻辑放在init方法中,该方法在每次测试开始时调用。这对我有所帮助。如果这不起作用,请尝试使用其他常量值。

public class ThreeMinuteRun {

    String cameraId = "cam1test";
    String videoStream = "http://xxx.xxx.xxx.xxx/mjpg/video.mjpg"; //ip obfuscated for this online question
    String format = "MJPG";
    MotionDetectionType motionType= MotionDetectionType.basic;
    AwarenessAnalytics AA; // <---------------  CHANGED -------------
    String maskFilename = "/home/will/odev/MotionDetect/src/main/resources/DrivewayMaskWhite.png";
    MotionDetectionState motionDetectionState = MotionDetectionState.on;
    String directoryStore = "/media/PENDRIVE/alertImageTest/";

    private void init() {
        AA = new AwarenessAnalytics();
    }

    @Test
    public void testSetVideoSource() {
        init();
        try {
            AA.setVideoSource(cameraId, videoStream, format, motionType);
        } catch (IOException e) {
            fail("IOException in setVideoSource");
        }
    }

答案 1 :(得分:2)

如果您想在执行AA.start()之类的每个目标方法之前执行AA.addListener(new DetectionListener());,则应使用@Before注释。 然后,您可以在执行每个AA.start()目标方法之前执行@Test方法。如果在测试后执行该方法,则应使用@After注释。

public class ThreeMinuteRun {

    ...

    @Before
    public void setUp() throws Exception {
        AA.start();
    }

    @After
    public void tearDown() throws Exception {
        AA.stop();
    }

    ...

    @Test
    public void testAddListener() {
        AA.addListener(new DetectionListener());
    }
}

testAddListener测试被调用时,它将按如下顺序调用:

  1. AA.start();
  2. AA.addListener(new DetectionListener());
  3. AA.stop()

答案 2 :(得分:1)

你可以在每次测试之前使用它来执行某些事情,但我不确定你是否需要这个。

@Before 
public void method()

此方法在任何测试开始之前执行一次。

@BeforeClass 
public static void method()

这看起来也有点儿错误

@Test
public void testSetImageStoreLocation() {
    AA.setImageStoreLocation(directoryStore);; <==
}

编辑:也许您应该切换到JUnit依赖项而不是您正在使用的依赖项。我不确定所有其他库是否具有相同的注释可能是您在混合不同的测试框架时获得空指针异常的原因。请务必检查构建路径中是否有JUnit库,而不仅仅是导入语句。