Mock Protected Parent Method When the Parent is in a Different Package(当父级在不同的包中时模拟受保护的父级方法)
问题描述
我需要在我的测试类的父类中模拟一个受保护的方法,但父类位于不同的包中,因此我的测试类无法访问该方法,因此我无法模拟它.这个问题必须有一个无需重构的解决方案
I need to mock a protected method in the parent class of my class under test but the parent class is in a different package so my test class cannot access that method so I cannot mock it. There's gotta be a solution for this issue without refactoring
我需要使用 Powermock 和 Mockito.这是 JAR
I need to use Powermock and Mockito. Here's the JARs
- mockito-all 1.10.8
- powermock-core 1.6.1
- powermock-module-junit4 1.6.1
- powermock-api-mockito 1.6.1
- junit 4.12
这是遗留代码,所以我无法重构,但这是简化的代码.
This is legacy code so I cannot refactor, but here's the simplified code.
Parent.java
package parent;
public class Parent {
// Want to mock this protected parent method from different package
protected String foo() {
String someValue = null;
// Logic setting someValue
return someValue;
}
}
Child.java
package child;
import parent.Parent;
public class Child extends Parent {
String fooString = null;
public String boo() {
this.fooString = this.foo();
String booString = null;
// Logic setting booString
return booString;
}
}
ChildTest.java
package child;
import static org.mockito.Mockito.spy;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import parent.Parent;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Parent.class, Child.class })
public class ChildTest {
// Class Under Test
Child cut;
@Before
public void setUp() throws Exception {
// Partial mock to mock methods in parent class
cut = spy(new Child());
}
@Test
public void testBoo() {
// TODO: Need to mock cut.foo() but can't figure out how.
// Following gives me this error: The method foo() from the type Parent is not visible
Mockito.when(((Parent)cut).foo()).thenReturn("mockValue");
// Test
cut.boo();
// Validations
Assert.assertEquals(cut.fooString, "mockValue");
}
}
推荐答案
你可以使用 PowerMock 来模拟没有公共方法.
You can use PowerMock to mocking no public method.
@RunWith(PowerMockRunner.class)
public class ChildTest {
@Test
public void testBoo() throws Exception {
//given
Child child = PowerMockito.spy(new Child());
PowerMockito.when(child, "foo").thenReturn("mockValue");
//when
String boo = child.boo();
//then
Assert.assertEquals("boo+mockValue", boo);
}
}
这篇关于当父级在不同的包中时模拟受保护的父级方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:当父级在不同的包中时模拟受保护的父级方法


基础教程推荐
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 降序排序:Java Map 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01