1

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

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 !
    }
}

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

4

2 回答 2

7

这种设计很难模拟,并且揭示了您的测试类中可能存在的设计缺陷或至少是弱点。它可能需要某种注入框架(即 Spring),这样您就不会显式调用 B 构造函数。然后您的第二次测试尝试将在现场

如果 Spring 过于笨重,则有更轻量级的注入框架。或者最后,您可以将 B 作为 A 的构造函数参数传入。然后您必须使用 Mockito.mock(B.class) 来制作您的 B 模拟,然后再将其传递给 A 构造函数(然后您将放弃使用Mockito 注释)。

于 2013-05-01T04:49:55.853 回答
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 !

 }
}
于 2013-05-01T02:05:42.753 回答