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

PowerMock - How to call manipulate the parameters of a mocked method

我正在使用 PowerMock/EasyMock 来测试一个静态方法,其中一个参数是一个 StringBuffer,它被模拟 class.

中的一个方法追加。

这是一个简化的class演示。

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 变量在调用模拟方法之前更新。

即我得到以下...

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

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

问题是您正在调用 test(var)andDelegateTo 需要一个与模拟 class/interface 相同的对象。参见 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;
        }
    })