easymock总是回归NPE

时间:2014-05-04 00:33:19

标签: unit-testing testing easymock powermock

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

我有以下课程,我正在尝试测试,我已经将我的班级剥离到最低限度

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();
    }
}

我的测试课

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

我有点陷入困境,不知道我错过了什么 - 感谢任何帮助。

另请指出我在线的任何资源,以帮助我获得更好的理解。

1 个答案:

答案 0 :(得分:0)

我认为你让PowerMock和EasyMock感到困惑。

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

只有在您要模拟的类/方法是final,private或static时才需要使用PowerMock。在这些情况下,PowerMock提供EasyMock不具备的额外功能。

所以看看你的测试类,我看到你使用EasyMock创建了你的模拟,然后使用EasyMock设置你的期望,但后来尝试使用PowerMock重放模拟。这不会奏效。

最终发生的事情是你的模拟对象仍处于&#34;记录模式&#34;因此,将默认值返回给它上面的任何方法调用。在返回对象的方法的情况下,默认值为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);
}

请注意,请记住验证您的模拟以确保已发生预期的行为。

当然,您之前已经看过这个,但是here is the EasyMock website.它有很多关于如何使用EasyMock的文档和示例。

为了完整性,here also is the PowerMock website.虽然在学习的同时,我想我暂时会避免使用PowerMock。