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