【问题标题】:How to write unit tests for classes with CheckedProviders in their constructors如何在构造函数中为带有 CheckedProviders 的类编写单元测试
【发布时间】:2016-12-18 14:53:30
【问题描述】:

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

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 的组合来编写测试。任何输入都将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      正如另一个答案所暗示的,您也可以轻松地模拟提供程序。

      但 youMyCheckedProvider 不必这样做。

      您已经有一个界面坐在那里,那么什么会阻止您创建类似的东西

      class MyCheckedProviderImpl<T> implements MyCheckedProvider<T> {
      

      并且那个想法在它的构造函数中接受了一个 T 对象并完全返回那个?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        相关资源
        最近更新 更多