确保甚至调用侦听器更新的最简单方法是什么?
更新:我正在测试监听器(不是主题),一旦调用更新,测试通过。
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");
}
});
答案 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”