我有一个正在测试的类,其构造符如下所示:
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的组合来编写测试。任何输入都将受到赞赏。
答案 0 :(得分:1)
你可以做的是模拟提供者而不是客户端。 ClientOne
和ClientTwo
是您传递给通用类的类型,它们不是变量,因此不是您想要模拟的内容。相反,您传递给构造函数的提供程序实际上是变量,您需要控制(模拟)的是这些变量的行为。
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对象并返回了那个?
这或多或少与模拟框架所做的相同。