我有下面的类,想为它编写单元测试。下面是供完全参考的类。X
是POJO
public class StatusTable {
private P tableData;
private Q tableDefinition;
public StatusTable(final List<X> xList,
final A a,
final B b)
throws URISyntaxException {
setTableDefinition(a, b);
setTableData(xList, b, a);
}
private void setTableDefinition(final A a,
final B b) {
//some code
}
public void setTableData(final List<X> xList,
final B b, final A a)
throws URISyntaxException {
for (X sfm : xList) {
//some code
}
}
}
作为单元测试的新手,我对如何进行测试的想法很少,但这里有一个想法。请纠正任何不正确的地方。
public class StatusTableTest {
private StatusTable statusTable;
@Mock
private A mockA;
@Mock
private B mockB;
@Mock
private X mockX;
public void setUp() {
stub(mockX.getSomeValue()).toReturn(?); //want to return any string
stub(mockX.getSomeAnotherValue()).toReturn(?); //want to return any integer
//Similarly mock other functions retuning
this.statusTable = new StatusTable(xList, mockA, mockB,);
}
public void setTableDefinitionTest() {
//test the code
}
}
我有一些疑问:
a) 我做得对吗?X应该被嘲笑吗?
b) Mockito中有String()类型的功能吗?我应该使用其他功能吗?
a)没有实际的代码很难判断。您可以模拟单个X值或整个X列表。
b) 最终结果是基于期望值的,所以不应该返回anyString(),而应该返回一些特定的String。因此,您可以验证您的代码对于这个特定的String是否正确运行。也就是说,如果传递的列表中有一个X返回"abc",则断言该表包含一个带有"abc"文本的单元格。
取决于您想要模拟的内容。
您可以模拟对类的任何调用并返回任何值,或者监视现有类并用模拟调用重载调用。
例如
mockedX = Mockito.mock(X.class);
Mockito.when(mockedX.someFunction("1")).thenReturn(someAnswer);
或:
X x = new X();
spiedX = Mockito.spy(x);
Mockito.answer(some answer).when(spiedX).someFunction("1");
记住。。。被嘲笑的班级将返回你正在嘲笑的内容。
如果你创建这样的模拟:
Mockito.when(mockedX.someFunction(Mockito.anyString())).thenReturn("A");
那么在每次调用中,someFunction()都会返回"A"。