如何从抽象 class 模拟继承的受保护方法

How to mock inherited protected method from abstract class

给定一个摘要 class

public abstract class ClassA
{

   protected String getName()
   {
    return "my name"
   }

}

public class ClassB extends ClassA{
   public String doSomething(){
     String name = getName();
     return name + " cool ";
   }
}

public class TestClass { 

     @Before 
     public void setUp() { 
       MockitoAnnotations.initMocks(this); 
     } 

     @Test public void testDoSomething() { 
          ClassB b = new ClassB();
          b.doSomething();
     } 
} 

如何在为 classB 的 doSomething 方法编写测试时模拟 getName() 和 return 特定值。

与模拟混凝土的方式相同 class。在测试 class 中的 属性 旁边使用 @Mock 注释。

@Mock
private ClassA mockClassA;

然后使用

doReturn("mockname").when(mockClassA).getName()

here您可以找到更多详细信息。

@Test
public void testcase() {
    ClassB classB= spy(ClassB.class);
    when(classB.getName()).thenReturn(""); 
    classB.doSomething();

}
@Test
public void testcase() {
    ClassB b = mock(ClassB.class);
    doReturn("new name").when(b).getName();
}

您可以使用间谍而不是模拟。这样您就可以使用您之前准备的 ClassB 的现有实例:

ClassB classB = PowerMockito.spy(new ClassB());
PowerMockito.when(classB, method(ClassB.class, "getName")).withNoArguments()
            .thenReturn("your name");

也可以使用@Spy.

声明