Java 模拟继承的受保护方法
我这里有我的问题的简化版本。类有一个受保护的方法。类B继承此方法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编写一个
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()
中使用它,可能有一种更干净的方法,但是下面是
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";
};
};
为什么您要尝试测试与您测试的包不在同一个包中的东西?这可能是你想纠正的第一件事。