如何在构造函数中使用CheckedProviders为类编写单元测试

时间:2016-12-18 14:53:31

标签: unit-testing junit dependency-injection mocking guice

我有一个正在测试的类,其构造符如下所示:

public class ClassUnderTest {

ClientOne clientOne;
ClientTwo clientTwo;
OtherDependency otherDependency; 

@Inject
public ClassUnderTest(MyCheckedProvider<ClientOne> myCheckedProviderOne,
                   MyCheckedProvider<ClientTwo> myCheckedProviderTwo,
                   OtherDependency otherDependency) throws Exception {
       this.clientOne = myCheckedProviderOne.get();
       this.clientTwo = myCheckedProviderTwo.get();
       this.otherDependency = otherDependency; 
   }
    .
    .
    .
}

CheckedProvider看起来如此:

public interface MyCheckedProvider<T> extends CheckedProvider<T> {

  @Override
  T get() throws Exception;

}

我可以模拟客户端,但是如何使用我的模拟客户端初始化提供程序。我使用junit和mockito的组合来编写测试。任何输入都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

你可以做的是模拟提供者而不是客户端。 ClientOneClientTwo是您传递给通用类的类型,它们不是变量,因此不是您想要模拟的内容。相反,您传递给构造函数的提供程序实际上是变量,您需要控制(模拟)的是这些变量的行为。

public class ClassTest {

    private static final CientOne CLIENT_ONE = new ClientOne();
    private static final ClientTwo CLIENT_TWO = new ClientTwo();

    @Mock
    private MyCheckedProvider<ClientOne> providerOne;

    @Mock
    private MycheckedProvider<ClientTwo> providerTwo;

    private ClassUnderTest classUnderTest;

    @Before
    public void setUp() {
        when(providerOne.get()).thenReturn(CLIENT_ONE);
        when(providerTwo.get()).thenReturn(CLIENT_TWO);
        classUnderTest = new ClassUnderTest(providerOne, providerTwo, otherDependency);
    }
}

答案 1 :(得分:1)

正如另一个答案所示,你也可以轻易地模拟提供者。

但是你的推荐提供者不必。

你已经有一个界面,所以什么会阻止你创建像

这样的东西
class MyCheckedProviderImpl<T> implements MyCheckedProvider<T> {

并且think在其构造函数中获取了一个T对象并返回了那个?

这或多或少与模拟框架所做的相同。