java - 如何在Junit中模拟子类的构造函数?

标签 java unit-testing junit constructor jmockit

类结构如下所示:

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 测试用例,并且需要模拟 A 类的构造函数,以便每当需要创建 B 类的对象时,A 类的模拟构造函数应该被调用并从模拟构造函数返回对象。

我尝试了以下操作:

       new MockUp<A>() {

            @Mock
            public void $init(String b1) {
                new A("A11111111", b1);
            }
        };

但是在模拟构造函数中创建的对象尚未返回。

最佳答案

好吧,您走在正确的道路上...它需要 @MockMockUpInvocable 的组合解封装 ...您必须向您的$init模拟方法添加一个调用,然后使用解封装来查看A 内部结构。这是一个例子。我使用了您的 A 类和 B 类,只是稍微清理了一下它们并添加了 setter/getter 以方便使用。我故意没有添加 setter,这样我就可以展示如何解决缺少 setter 的问题。

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 后,结果为

关于java - 如何在Junit中模拟子类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954439/

相关文章:

java - 如何在java中对方法进行排队

java - Android Studio : HorizontalView

Java自定义数值接口(interface)——平方根

unit-testing - Grails 单元测试 : error while redirecting to an action of another controller

java - 如何为此 "FileNotFoundException"编写Junit测试

java - 如何使用带有 OpenCV 的 Java 从边界框读取文本

python - 我应该在每个测试中断言相同的值吗?

java - 你会像 "inherit and override"一样模拟被测试的类吗?

java - Mockito单元测试时如何生成H2嵌入式数据库?

java - 如何在不使用 @Test 注释的情况下定义 Junit 测试用例