UnitTest:如何测试是否已调用Listener的更新

时间:2011-03-03 02:58:50

标签: java unit-testing

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

更新:我正在测试监听器(不是主题),一旦调用更新,测试通过。

     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");

        }
    });

3 个答案:

答案 0 :(得分:2)

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

我质疑你的陈述“更新:我正在测试监听器(而不是主题)”。如果您的测试正在验证监听器是否被调用,那么您正在测试应该调用监听器的东西,而不是监听器本身。那是什么?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会通过替换调用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”