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实际上我们需要监视该类。你能试试这个,看看是否管用吗。间谍将确保模拟的实现被调用(如果提供的话),而不是实际的代码。嗨,欢迎使用堆栈溢出!只想让你知道:当你回答一个问题时,试着发布一些比代码更完整的东西,也许可以添加一些关于作者错误的解释,以及你是如何修复它的。我告诉你这些是因为你的答案在“低质量帖子”队列中被标记为删除。您可以使用“编辑”按钮编辑答案,或者单击此处:您好,欢迎使用堆栈溢出!只想让你知道:当你回答一个问题时,试着发布一些比代码更完整的东西,也许可以添加一些关于作者错误的解释,以及你是如何修复它的。我告诉你这些是因为你的答案在“低质量帖子”队列中被标记为删除。您可以使用“编辑”按钮或单击此处编辑答案: