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

时间:2015-10-05 17:29:14

标签: 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);
            }
        };

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

1 个答案:

答案 0 :(得分:1)

好的,你走的是正确的道路......它需要@MockMockUpInvocationDeencapsulation的组合......你必须添加一个对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