PowerMock - 如何调用操作模拟方法的参数

时间:2015-06-29 17:23:16

标签: java junit powermock easymock

我正在使用PowerMock / EasyMock来测试一个静态方法,其中一个参数是一个StringBuffer,由该模拟类中的方法附加。

这是一个简化的演示类。

import java.util.Date;

public class ContentChanger
{
    public static int change(StringBuffer sb)
    {
        sb.append( new Date() );
        return 0;
    }
}

这是单元测试...

import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(ContentChanger.class)
public class ContentChangerTest
{
    @Test
    public void test001()
    {
    // Declare an empty StringBuffer
    StringBuffer var = new StringBuffer();

    // Enable static mocking for the ContentChanger class
    PowerMock.mockStatic( ContentChanger.class );

    // Catch the call and send to test method
    EasyMock.expect(ContentChanger.change( var )).andDelegateTo( test(var) );

    // Replay all mock classes/methods
    PowerMock.replayAll();

    // Call the method to be mocked
    System.out.println( ContentChanger.change( var ) + " = " + var );
    }


    private int test( StringBuffer sb )
    {
        sb.append( "Mocked" );
        return 1;
    }
}

我期望发生的是调用测试方法并输出StringBuffer ..

  

1 = MOCKED

但是发生的事情是在调用模拟方法之前更新了StringBuffer var。

即。我得到以下内容......

java.lang.AssertionError: 
  Unexpected method call ContentChanger.change(Mocked):
    ContentChanger.change(Mocked): expected: 1, actual: 2

有没有办法调用另一个类/方法,在调用时更改参数的内容而不是预重放。

1 个答案:

答案 0 :(得分:1)

问题在于您正在呼叫test(var)andDelegateTo期望一个Object与mock相同的类/接口。请参阅http://easymock.org/user-guide.html#verification-creating

由于您使用的是静态方法,因此无法实现。所以最好是使用IAnswer。这是工作代码:

        EasyMock.expect(ContentChanger.change( var )).andAnswer(new IAnswer<Integer>() {
        @Override
        public Integer answer() throws Throwable {
            StringBuffer sb = (StringBuffer) EasyMock.getCurrentArguments()[0];
            sb.append( "Mocked" );
            return 1;
        }
    })