2012-08-07 96 views
0

我想通过PowerMock嘲笑私有方法,但在我expectPrivate方法,我没有所有的参数,我的单元测试有权访问(一些参数创建调用这个私有方法的方法)。因此,当我需要填写expectPrivate方法字段时,我无法这样做,并且我的单元测试不起作用。有什么办法可以解决这个问题吗?PowerMock嘲笑有限的数据访问私有方法

感谢

编辑:对不起我的可怕的解释。我写了一些代码来演示我的意思。

import java.lang.reflect.Method; 

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


@RunWith(PowerMockRunner.class) 
@PrepareForTest(Foo.class) 
public class FooTest 
{ 
    @Test 
    public void testFoobar() throws Exception{ 
     Foo x = new Foo("hi"); 

     PowerMock.mockStaticPartial(Foo.class, "foobar2"); 
     Method[] methods = MemberMatcher.methods(Foo.class, "foobar2"); 

     PowerMock.expectPrivate(Foo.class, methods[0], x).andReturn("hi"); 

     PowerMock.replay(Foo.class); 

     Foo.foobar("hi"); 

    } 
} 

public class Foo 
{ 
    public String name; 
    public Foo(String aString){ 
     name = aString; 
    } 

    public static String foobar(String aString){ 

     Foo aFoo = new Foo("hi"); 

     aString = aString + foobar2(aFoo); 

     return aString + " blah"; 
    } 

    private static String foobar2(Foo aFoo){ 
     return "hi" + aFoo.name; 
    } 
} 

我不能嘲笑foobar2方法,因为我无法重新创建富aFoo的foobar的方法创建的。它会给我一个错误,说我为测试创建的对象与进入私有方法的对象不一样。

+0

你能详细说明吗?显示代码始终是一个优点。 – oldrinb 2012-08-07 04:09:48

+0

像,使用expectPrivate的参数需要它嘲笑的方法的参数吗?我只是无法访问这些论点。例如我正在模拟方法foobar(obj x,obj y)作为foo类的一部分,我无法填充我的参数expectPrivate(foo.class,“foobar”,x,y),因为我无法访问到我的单元测试方法中的对象x和y – KWJ2104 2012-08-07 04:49:26

+0

那么为什么你不能访问你打算嘲笑的对象呢? – oldrinb 2012-08-07 04:51:50

回答

1

您当然可以访问在调用私有方法的方法内创建的参数。你需要让构造函数返回模拟对象。见http://code.google.com/p/powermock/wiki/MockConstructor

+0

我已更新OP。对不起,我原来的问题不是很清楚。 – KWJ2104 2012-08-07 18:32:43

+0

您的更新不会改变我的答案。如果你嘲笑构造函数返回一个模拟的Foo,那么foobar方法的第一行将获得你的模拟Foo。当你嘲笑foobar2的呼叫时,你会知道你的嘲弄Foo正在通过。 – 2012-08-07 20:05:07