2011-02-02 89 views
1
静态和动态两种方法

比方说,我们有惩戒与PowerMock

public class Foo { 
    public static Foo getInstance() {...} 

    public Bar bar(Baz baz) {...} 
} 

我想要做的就是嘲笑它在我的单元测试。我需要模拟一个类的静态和动态方法Foo。惩戒getInstance()是那么容易,因为

import static org.powermock.api.easymock.PowerMock.replace; 
import static org.powermock.api.easymock.PowerMock.method; 

public class MyTest { 

    @Test 
    public void myTest() { 
     replace(method(Foo.class, "getInstance")) 
     .with(method(MyTest.class, "getMockInstance")); 
    } 

    public static Foo getMockInstance() { 
     Foo foo = EasyMock.createMock(Foo.class); 
     EasyMock.replay(foo); 
     return foo; 
    } 
} 

的问题是,如何嘲笑bar方法?

上一个招数为replace(method(...)).with(method(...))不起作用,因为它不适用于动态方法。

试图嘲弄上已经嘲笑类的顶部也不起作用:上述

... 
@Test 
public void myTest() { 
     replace(method(Foo.class, "getInstance")) 
     .with(method(MyTest.class, "getMockInstance")); 

     Foo foo = Foo.getInstance(); // works well 
     Baz baz1 = new Baz(); 
     Baz baz2 = new Baz(); 
     EasyMock.expect(foo.bar(baz1)).andReturn(baz2); // exception thrown 
     EasyMock.replay(foo); 
} 
... 

代码抛出AssertionError: Unexpected method call bar

那么我该怎么做呢?我不想把.bar(...)嘲讽成getMockInstance,因为在现实世界中,我需要一些在静态getMockInstance方法中不可用的数据。

回答

3

我认为问题是,你在呼唤你的foo模拟重播两次,一次是在嘲笑静态方法getMockInstance(),你告诉嘲笑foo期待的foo.bar(bar1)电话后一次。尝试改变getMockInstance()

public static Foo getMockInstance() { 
     Foo foo = EasyMock.createMock(Foo.class); 
     return foo; 
    } 

,然后告诉EasyMock的重播foo你告诉它期望bar方法调用之后。所以MyTest.java看起来是这样的:

@Test 
public void myTest() { 
     replace(method(Foo.class, "getInstance")) 
     .with(method(MyTest.class, "getMockInstance")); 

     Foo foo = Foo.getInstance(); // works well 
     Baz baz1 = new Baz(); 
     Baz baz2 = new Baz(); 
     EasyMock.expect(foo.bar(baz1)).andReturn(baz2); // exception thrown 
     EasyMock.replay(foo); 
} 

    public static Foo getMockInstance() { 
     Foo foo = EasyMock.createMock(Foo.class); 
     return foo; 
    } 
+0

谢谢,它的工作。是否可以在不抑制重放的情况下实现同样的效果(例如,将Foo切换回另一个模式,添加更多模拟物并在最后切换回重放)? – mindas 2011-02-02 13:43:03