如何在 Junit 中模拟子类的构造函数?
How to mock constructor of subclass in Junit?
类 结构如下所示:
class A {
protected String a;
protected String b;
A(String b1) {
new A("A111", b1);
}
A(String a1, String b1) {
a = a1;
b = b1;
}
}
class B extends A {
B(String b) {
super("A", b);
}
}
我需要编写 JUnit 测试用例并且需要为 class A 模拟构造函数,这样每当 class B 的对象需要创建时,class A 的模拟构造函数应该得到从模拟构造函数调用和 returns 对象。
我试过以下方法:
new MockUp<A>() {
@Mock
public void $init(String b1) {
new A("A11111111", b1);
}
};
但是在模拟构造函数中创建的对象尚未返回。
好的,你走在正确的道路上......它需要 @Mock
、MockUp
、Invocation
和 Deencapsulation
的组合......你必须添加一个 Invocation
到你的 $init
模拟方法,然后使用 Deencapsulation 在 A
内部探索。这是一个例子。我使用了你的 A 和 B 类,只是稍微清理了它们并添加了吸气剂以便于使用。我故意没有添加二传手,所以我可以炫耀如何解决缺少二传手的问题。
package com.example.dcsohl;
import org.junit.Test;
import mockit.Deencapsulation;
import mockit.Invocation;
import mockit.Mock;
import mockit.MockUp;
public class TestTest {
public static class A {
protected String a;
protected String b;
public A(String b1) {
this("A111", b1);
}
public A(String a1, String b1) {
a = a1;
b = b1;
}
}
public static class B extends A {
public B(String b1) {
super("A", b1);
}
public String getA() {
return this.a;
}
public String getB(){
return this.b;
}
}
@Test
public void test() {
new MockUp<A>() {
@Mock public void $init(Invocation inv, String a1, String b1) {
A a = inv.getInvokedInstance();
Deencapsulation.setField(a, "b", b1);
}
};
B b = new B("foo");
System.out.println(b.getA());
System.out.println(b.getB());
}
}
您会注意到,最后,打印输出显示我成功设置了 b
的值,但是,单独留下 a
,结果显示为 null
.
类 结构如下所示:
class A {
protected String a;
protected String b;
A(String b1) {
new A("A111", b1);
}
A(String a1, String b1) {
a = a1;
b = b1;
}
}
class B extends A {
B(String b) {
super("A", b);
}
}
我需要编写 JUnit 测试用例并且需要为 class A 模拟构造函数,这样每当 class B 的对象需要创建时,class A 的模拟构造函数应该得到从模拟构造函数调用和 returns 对象。
我试过以下方法:
new MockUp<A>() {
@Mock
public void $init(String b1) {
new A("A11111111", b1);
}
};
但是在模拟构造函数中创建的对象尚未返回。
好的,你走在正确的道路上......它需要 @Mock
、MockUp
、Invocation
和 Deencapsulation
的组合......你必须添加一个 Invocation
到你的 $init
模拟方法,然后使用 Deencapsulation 在 A
内部探索。这是一个例子。我使用了你的 A 和 B 类,只是稍微清理了它们并添加了吸气剂以便于使用。我故意没有添加二传手,所以我可以炫耀如何解决缺少二传手的问题。
package com.example.dcsohl;
import org.junit.Test;
import mockit.Deencapsulation;
import mockit.Invocation;
import mockit.Mock;
import mockit.MockUp;
public class TestTest {
public static class A {
protected String a;
protected String b;
public A(String b1) {
this("A111", b1);
}
public A(String a1, String b1) {
a = a1;
b = b1;
}
}
public static class B extends A {
public B(String b1) {
super("A", b1);
}
public String getA() {
return this.a;
}
public String getB(){
return this.b;
}
}
@Test
public void test() {
new MockUp<A>() {
@Mock public void $init(Invocation inv, String a1, String b1) {
A a = inv.getInvokedInstance();
Deencapsulation.setField(a, "b", b1);
}
};
B b = new B("foo");
System.out.println(b.getA());
System.out.println(b.getB());
}
}
您会注意到,最后,打印输出显示我成功设置了 b
的值,但是,单独留下 a
,结果显示为 null
.