我怎样才能用反射来保存私有方法,然后在调用返回`stubbed <x>`object?</x>时说出测试代码

时间:2014-08-03 14:20:54

标签: java mockito

为了测试下面的示例源代码,我使用Java Reflection编写了一堆代码。但是,我无法运行,所以我删除了。

我的目标基本上是反映bar()的{​​{1}}方法,并将其存根,以便在CLASSZ中调用它时,它将返回{{1}的存根实例}}。然后,此存根实例将作为参数发送到foo()

在测试代码结束时,我计划调用Reader方法,并使用另一个gar()检查它的返回值。

我的问题是&#34;如何使用反射来存储私有方法,然后在调用返回存根foo()对象的时候说出测试代码?&#34;。

String

1 个答案:

答案 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; }
   }
}