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

How to write unit tests for classes with CheckedProviders in their constructors

我有一个正在测试的 class,其构造函数如下所示:

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;

}

我可以模拟客户端,但是如何使用我的模拟 clients.I 初始化提供者 使用 junit 和 mockito 的组合来编写 tests.Any 输入将不胜感激。

您可以做的是模拟提供者而不是客户。 ClientOneClientTwo 是您传递给通用 class 的 类型 ,它们不是 变量 因此不是您想嘲笑的东西。相比之下,您传递给构造函数的提供者实际上是变量,您需要控制(模拟)的是这些变量的行为。

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);
    }
}

正如其他答案所暗示的那样,您也可以轻松地模拟提供者。

但您MyCheckedProvider 不必。

你已经有一个 接口 坐在那里,那么什么会阻止你创建类似

class MyCheckedProviderImpl<T> implements MyCheckedProvider<T> {

think 在其构造函数中使用了一个 T 对象,returns 正是这样吗?

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