模拟受保护的构造函数
Mocking Protected Constructor
我想模拟 super() 调用 protected constructor。
为此我使用 "PowerMockito.suppress"
但它不起作用(代码调用超级构造函数并抛出 runtimeException)。
如何模拟 super call(),使其什么都不做。
public class FooClass {
public void someMethod(){
String arg1 = "arg1";
Integer arg2 = 123;
ExtendedClass extendedClass = new ExtendedClass(arg1, arg2);
}
}
public class SuperClass {
protected SuperClass(String arg1, Integer arg2) {throw new RuntimeException();}
}
public class ExtendedClass extends SuperClass{
public ExtendedClass(String arg1, Integer arg2){
super(arg1, arg2);
}
}
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(MockitoJUnitRunner.class)
@PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.http.conn.ssl.*", "javax.net.ssl.*"})
@PrepareForTest({SuperClass.class})
public class TestClass extends TestCase{
@InjectMocks
FooClass fooClass = new FooClass();
@Test
public void test(){
PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));
fooClass.someMethod();
}
}
您必须为测试准备 ExtendedClass 而不是 SuperClass。
改变
@PrepareForTest({SuperClass.class})
PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));
到
@PrepareForTest({ExtendedClass.class})
PowerMockito.suppress(PowerMockito.constructor(ExtendedClass.class, String.class, Integer.class));
您在我的机器上测试成功通过:
您使用哪个版本的 powermock 和 mockito?
这是我的:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.3</version>
<scope>test</scope>
</dependency>
你的问题的根本原因是@pvpkiran 已经写道你必须为测试准备 ExtendedClass 而不是 SuperClass
更新:
看看这个linkSuppress-Unwanted-Behavior#suppress-super-class-constructors
@RunWith(PowerMockRunner.class)
@PrepareForTest({TestParentConstructor.ExtendedClass.class})
public class TestParentConstructor {
@Before
public void init() {
suppress(constructor(SuperClass.class));
}
@Test
public void test(){
FooClass fooClass = new FooClass();
fooClass.someMethod();
}
public class FooClass {
public void someMethod(){
String arg1 = "arg1";
Integer arg2 = 123;
ExtendedClass extendedClass = new ExtendedClass(arg1, arg2);
}
}
public class SuperClass {
protected SuperClass(String arg1, Integer arg2) {throw new RuntimeException();}
}
public class ExtendedClass extends SuperClass{
public ExtendedClass(String arg1, Integer arg2){
super(arg1, arg2);
System.out.println("Hello from Extended!");
}
}
}
我想模拟 super() 调用 protected constructor。
为此我使用 "PowerMockito.suppress" 但它不起作用(代码调用超级构造函数并抛出 runtimeException)。
如何模拟 super call(),使其什么都不做。
public class FooClass {
public void someMethod(){
String arg1 = "arg1";
Integer arg2 = 123;
ExtendedClass extendedClass = new ExtendedClass(arg1, arg2);
}
}
public class SuperClass {
protected SuperClass(String arg1, Integer arg2) {throw new RuntimeException();}
}
public class ExtendedClass extends SuperClass{
public ExtendedClass(String arg1, Integer arg2){
super(arg1, arg2);
}
}
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(MockitoJUnitRunner.class)
@PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.http.conn.ssl.*", "javax.net.ssl.*"})
@PrepareForTest({SuperClass.class})
public class TestClass extends TestCase{
@InjectMocks
FooClass fooClass = new FooClass();
@Test
public void test(){
PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));
fooClass.someMethod();
}
}
您必须为测试准备 ExtendedClass 而不是 SuperClass。
改变
@PrepareForTest({SuperClass.class})
PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));
到
@PrepareForTest({ExtendedClass.class})
PowerMockito.suppress(PowerMockito.constructor(ExtendedClass.class, String.class, Integer.class));
您在我的机器上测试成功通过:
这是我的:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.3</version>
<scope>test</scope>
</dependency>
你的问题的根本原因是@pvpkiran 已经写道你必须为测试准备 ExtendedClass 而不是 SuperClass
更新: 看看这个linkSuppress-Unwanted-Behavior#suppress-super-class-constructors
@RunWith(PowerMockRunner.class)
@PrepareForTest({TestParentConstructor.ExtendedClass.class})
public class TestParentConstructor {
@Before
public void init() {
suppress(constructor(SuperClass.class));
}
@Test
public void test(){
FooClass fooClass = new FooClass();
fooClass.someMethod();
}
public class FooClass {
public void someMethod(){
String arg1 = "arg1";
Integer arg2 = 123;
ExtendedClass extendedClass = new ExtendedClass(arg1, arg2);
}
}
public class SuperClass {
protected SuperClass(String arg1, Integer arg2) {throw new RuntimeException();}
}
public class ExtendedClass extends SuperClass{
public ExtendedClass(String arg1, Integer arg2){
super(arg1, arg2);
System.out.println("Hello from Extended!");
}
}
}