在构造函数中使用模拟

时间:2013-05-01 00:55:44

标签: java unit-testing junit mockito

是否可以在构造函数中使用模拟?

Class A{

    public B b = new B();

    public A( String input ){

        //I need to stub this method
        b.someMethod( input );
    }

    // Class implementations
}

单元测试:

Class ATest{

    @Mock
    B b;
    @InjectMock
    A a;

    //option1:
    @Before
    setup(){
        MockitoAnnotations.initMocks( this ); //Fails - since A isnt instantiated
        a = new A();
    }

    //option2:
    @Before
    setup(){
        a = new A();
        MockitoAnnotations.initMocks( this ); // Fails in new A() due to method i want to stub as mocks werent initialized yet !
    }
}

我该如何处理?提前谢谢。

2 个答案:

答案 0 :(得分:7)

这种设计难以嘲笑,并且揭示了您所选课程中可能的设计缺陷或至少是弱点。它可能需要某种注入框架(即Spring),因此您不会显式调用B构造函数。那么你的第二次测试就会出现在

如果Spring太沉重,那么注入框架会更轻。或者最后,您可以将B in作为A的构造函数参数传递。然后,您必须使用Mockito.mock(B.class)将B模型传递给A构造函数(然后您将放弃使用Mockito注释)。

答案 1 :(得分:0)

我不确切地理解你要从中做什么,但你的第二种方法是正确的。只需要像对A类一样实例化B类。所以,基本上这就是你需要做的所有事情:

//option2:
@Before
setup(){

a = new A();
b = new B();
MockitoAnnotations.initMocks( this ); // Fails in new A() due to method i want to stub as       mocks werent initialized yet !

 }
}