Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UnitTest:如何测试侦听器';s的更新已被调用_Java_Unit Testing - Fatal编程技术网

Java UnitTest:如何测试侦听器';s的更新已被调用

Java UnitTest:如何测试侦听器';s的更新已被调用,java,unit-testing,Java,Unit Testing,确保已调用侦听器更新的最简单方法是什么 更新:我正在测试侦听器(而不是主题),一旦调用了更新,测试就通过了 d.addServiceComponentChangeListener(new ServiceComponentChangeListener() { //In the Unittest, I want to make sure this has been called public void notifyChange(ServiceCompone

确保已调用侦听器更新的最简单方法是什么

更新:我正在测试侦听器(而不是主题),一旦调用了更新,测试就通过了

     d.addServiceComponentChangeListener(new ServiceComponentChangeListener() {

        //In the Unittest, I want to make sure this has been called
        public void notifyChange(ServiceComponentChangeEvent event) {
            System.out.println("@notifyChange");

        }
    });

如果侦听器实现了接口,则可以创建一个实现侦听器的模拟类。然后您可以设计此模拟以适合您的测试。如果它没有实现接口,只要侦听器类不是final,您就可以对其进行扩展。

即使侦听器没有实现接口,您仍然可以使用类似的方法为其创建模拟。使用运行时代码插入、要模拟的类的检查和紫色精灵灰尘,它可以模拟其他类。在我的公司,大多数单元测试使用Mockito(较新的)或EasyMock(较旧的),因此我们确信我们只测试一个类


不过,我对你的说法“更新:我在测试听者(而不是主题)”表示怀疑。如果您的测试是验证侦听器是否被调用,那么您测试的是应该调用侦听器的东西,而不是侦听器本身。那么是哪一个呢?

我将通过替换call System.out或该部分真正应该使用的接口来测试它,该接口稍后将被模拟,并使用行为验证来确保它被调用。所以

public class d 
    {
        private MessageDisplayer m_UserDisplay;

        public d()
        {
          m_UserDisplay = new DisplaySystemOut()
        }

        public d(MessageDisplayer AllowsSensing)
        {
          m_UserDisplay = AllowsSensing;
        }

    //blah blah blah....

              d.addServiceComponentChangeListener(new ServiceComponentChangeListener() 
            {
            public void notifyChange(ServiceComponentChangeEvent event) {
                m_UserDisplay.DisplayMessage("@notifyChange");

            }
        });

    } 

现在,您可以在测试中模拟MessageDisplayer,并确保它被调用,并且参数等于“@notifyChange”

如果它是异步的,您可能需要等待并睡眠一段时间,如果没有收到答案,则会失败。您是对的,我实际上是在测试主题,但从侦听器的角度来看。。