Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟继承的受保护方法_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 模拟继承的受保护方法

Java 模拟继承的受保护方法,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我这里有我的问题的简化版本。类有一个受保护的方法。类B继承此方法 public class A{ protected String getString(){ //some Code } } public class B extends A{ public void doSomething(){ //someCode String result = getString(); } } 我现在用Mockito编写一个

我这里有我的问题的简化版本。类有一个受保护的方法。类B继承此方法

public class A{
    protected String getString(){
        //some Code
    }
}


public class B extends A{
    public void doSomething(){
        //someCode
        String result = getString();
    }
}
我现在用Mockito编写一个单元测试,它在另一个包测试中,我想测试
doSomething()
方法。为此,我需要模拟getString()调用。由于该方法受保护,并且我的测试类位于不同的RNet包中,因此我无法使用
doReturn(…).when(classUnderTest).getString()
。问题是,我监视类B。因此我不能使用
mock(新的B(),Mockito.CALLS\u REAL\u方法)

我尝试通过反射获得受保护的方法:

Method getString = classUnderTest.getClass().getDeclaredMethod("getString");
getString.setAccessible(true);

但是我不知道如何在
doReturn()

中使用它,可能有一种更干净的方法,但是下面是

  • 为“a”创建一个模拟
  • 创建另一个扩展B并重写该方法的类
  • 使被重写的方法调用mock
  • 例如

    private A partialMock;
    private B classUnderTest;
    
    @Before
    public void setup() {
        partialMock = mock(A.class);
        classUnderTest = new B() {
            @Override
            protected String getString() {
                return partialMock.getString();
            }
        };
    }
    
    @Test
    public void shouldDoSomething() {
    
        when(partialMock.toString()).thenReturn("[THE MOCKED RESPONSE]");
    
        classUnderTest.doSomething();
    
        // ...verify stuff...
    }
    

    显然,您甚至不需要使用mock,您可以直接从重写的方法返回一些内容。

    您可以使用“重写和子类”

    B b = new B() {
      @Override
      protected String getString() {
        return "FAKE VALUE FOR TESTING PURPOSES";
      };
    };
    

    为什么您要尝试测试与您测试的包不在同一个包中的东西?这可能是你想纠正的第一件事。