为了测试下面的示例源代码,我使用Java Reflection编写了一堆代码。但是,我无法运行,所以我删除了。
我的目标基本上是反映bar()
的{{1}}方法,并将其存根,以便在CLASSZ
中调用它时,它将返回{{1}的存根实例}}。然后,此存根实例将作为参数发送到foo()
。
在测试代码结束时,我计划调用Reader
方法,并使用另一个gar()
检查它的返回值。
我的问题是"如何使用反射来存储私有方法,然后在调用返回存根foo()
对象的时候说出测试代码?"。
String
答案 0 :(得分:0)
如果您愿意将private Reader bar()
转换为protected
,则可以使用Mockito spying
来源:
package sw_stackoverflow;
class CLASSZ{
public String foo(){
Reader reader = bar();
String text = gar(reader);
return text;
}
protected Reader bar(){
// do some operation related with Extractor; then create instance of Reader
return new RealReader(/*extractor related argument*/);
}
private String gar(Reader reader){
// do something and return String
return reader.some_string_getter();
}
interface Reader { String some_string_getter(); }
protected static class RealReader implements Reader
{
@Override public String some_string_getter() { return "hello from real method"; }
}
}
的Junit:
package sw_stackoverflow;
import static junit.framework.Assert.assertEquals;
import org.mockito.Mockito;
import static org.mockito.Mockito.*;
import org.junit.Test;
public class CLASSZTest {
@Test
public void mockito_can_stub_protected_methods ()
throws Exception
{
final CLASSZ.Reader r = new StubReader("hello from mockito");
CLASSZ realO = new CLASSZ();
CLASSZ spyO = spy(realO);
when(spyO.bar()).thenReturn(r);
assertEquals("hello from mockito",spyO.foo());
}
protected static class StubReader implements CLASSZ.Reader
{
final String s;
StubReader(String s) { this.s = s; }
@Override public String some_string_getter() { return s; }
}
}