unit easymock总是返回NPE



我是使用mock框架的新手,我正在尝试添加一些新的测试用例

我有下面的类,我试图测试,我已经剥离了我的类到最低限度

public class LanguageMapping {
    protected Map<String, String> languageMapping;
    public Map<String, String> getLanguageMapping() {
        return languageMapping;
    }
    public void updated(Dictionary properties) throws ConfigurationException {
        languageMapping = new HashMap<String, String>();
        String mappingPath = properties.get(
                SealMappingServiceConstants.SEAL_MAPPING_PATH).toString();
    }
}

My Test class

public class LanguageMappingTest {
    Dictionary properties;
    Object object;
    @Before
    public void setUp(){
        properties = EasyMock.createMock(Hashtable.class);
        object = new String("/etc/language-mapping");       
    }
    @Test 
    public void testGetLanguageMapping() throws ConfigurationException{
        LanguageMapping mappingService = new LanguageMapping();
        EasyMock.expect(properties.get(Constants.SEAL_MAPPING_PATH)).andReturn(object);
        //EasyMock.expect(object.toString()).andReturn("/etc/language-mapping");
        PowerMock.replayAll();
        mappingService.updated(properties);
        //assertNotNull(mappingService.getLanguageMapping());           
    }

无论我做什么,Easy mock总是在我正在测试的类的下一行指示NullPointerException。

String mappingPath = properties.get(
                Constants.SEAL_MAPPING_PATH).toString();

我有点困在这一点上,不知道我错过了什么-任何帮助都是感激的。

也请给我指出任何在线资源,以帮助我更好地了解。

我想你把PowerMock和EasyMock搞混了。

当您创建对象的模拟实例并设置期望并验证它们已经发生时,那么EasyMock可以自己使用。

PowerMock只需要在你想模拟的类/方法是final的、私有的或静态的情况下使用。在这些情况下,PowerMock提供了EasyMock没有的额外功能。

因此,看看您的测试类,我看到您已经使用EasyMock创建了模拟,然后使用EasyMock设置了期望,然后尝试使用PowerMock重放模拟。这行不通。

最终发生的情况是,您的模拟对象仍然处于"记录模式",因此对对其进行的任何方法调用返回默认值。在方法返回对象的情况下,默认值为null,因此您的NPE。

我已经改变了你的测试方法,使用EasyMock.replay()方法,它对我来说工作得很好:

@Test
public void testGetLanguageMapping() throws ConfigurationException {
    final LanguageMapping mappingService = new LanguageMapping();
    EasyMock.expect(this.properties.get(SealMappingServiceConstants.SEAL_MAPPING_PATH)).andReturn(this.object);
    EasyMock.replay(this.properties);
    mappingService.updated(this.properties);
    EasyMock.verify(this.properties);
}

只是一个额外的注意,记住验证你的模拟,以确保预期的行为已经发生。

当然,你以前见过这个,但这是EasyMock的网站。它有很多关于如何使用EasyMock的文档和示例。

为了完整起见,这里还有PowerMock网站。虽然,在学习的过程中,我认为我暂时会避免使用PowerMock。

相关内容

  • 没有找到相关文章

最新更新