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

Java 如何模拟从抽象类继承的受保护方法,java,mockito,powermockito,Java,Mockito,Powermockito,给定一个抽象类 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 cla

给定一个抽象类

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()并返回特定值。

与模拟具体类的方法相同。使用测试类中属性旁边的@Mock注释

@Mock
private ClassA mockClassA;
然后使用

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

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

与模拟具体类的方式相同。使用测试类中属性旁边的@Mock注释

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

}
然后使用

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

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

您可以使用间谍而不是模拟。通过这种方式,您可以使用先前准备的ClassB的现有实例:

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

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

它也可以使用@Spy声明。

您可以使用Spy而不是mock。通过这种方式,您可以使用先前准备的ClassB的现有实例:

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

它也可以使用@Spy声明。

我确实这样做了,但仍然调用了函数。这是我的代码,它没有调用方法。变量bla有空值,这意味着它从未进入模拟类方法:`public class TestClass{@Mock private ClassA mockClassA;@Before public void setUp(){MockitoAnnotations.initMocks(this);}@Test public void testGetName(){String bla=mockClassA.getName();System.out.println(bla);}}}抽象类ClassA{受保护字符串getName(){返回“我的名字”;}}}`当我从测试中调用doSomething()函数时,getName()函数值将返回null或我设置的指定值?@Aki这是因为您在另一个实例而不是实际实例上模拟该方法。如果有,请参考我的答案helps@RatishBansal我也试过了,据说什么时候应该应用到mock上我确实做了这件事,但仍然调用了函数这是我的代码,它没有调用方法。变量bla有空值,这意味着它从未进入模拟类方法:`public class TestClass{@Mock private ClassA mockClassA;@Before public void setUp(){MockitoAnnotations.initMocks(this);}@Test public void testGetName(){String bla=mockClassA.getName();System.out.println(bla);}}}抽象类ClassA{受保护字符串getName(){返回“我的名字”;}}}`当我从测试中调用doSomething()函数时,getName()函数值将返回null或我设置的指定值?@Aki这是因为您在另一个实例而不是实际实例上模拟该方法。如果有,请参考我的答案helps@RatishBansal我也试过了,说什么时候应该申请mock@Aki实际上我们需要监视这个班级。你能试试这个,看看是否管用吗。spy将确保调用模拟的实现(如果提供),而不是实际的代码。@Aki实际上我们需要监视该类。你能试试这个,看看是否管用吗。间谍将确保模拟的实现被调用(如果提供的话),而不是实际的代码。嗨,欢迎使用堆栈溢出!只想让你知道:当你回答一个问题时,试着发布一些比代码更完整的东西,也许可以添加一些关于作者错误的解释,以及你是如何修复它的。我告诉你这些是因为你的答案在“低质量帖子”队列中被标记为删除。您可以使用“编辑”按钮编辑答案,或者单击此处:您好,欢迎使用堆栈溢出!只想让你知道:当你回答一个问题时,试着发布一些比代码更完整的东西,也许可以添加一些关于作者错误的解释,以及你是如何修复它的。我告诉你这些是因为你的答案在“低质量帖子”队列中被标记为删除。您可以使用“编辑”按钮或单击此处编辑答案: