【发布时间】:2020-07-01 03:08:37
【问题描述】:
单元测试新手在这里。
我有三个类:Db1Dao、Db2Dao、ExecuteClass 其中Db1Dao、Db2Dao 是两个不同数据库的数据库访问对象。我的目标是使用 Db1Dao 从 db1 获取一些数据并运行 executeClass.execute() 以使用 Db2Dao 将处理后的数据“放入”db2。
我的ExecuteClass 看起来像这样:
class ExecuteClass {
private Db1Dao db1Dao;
private Db2Dao db2Dao;
public void execute() {
...
List<String> listOfString = getExternalData(someParam);
List<Metadata> metadatum = db1Dao.get(someInputs);
... I do something to generate a list of new class `A` based on listOfString & metadatum ...
try {
db2Dao.put(listOfA);
} catch (PutException e){
...
}
}
public List<String> getExternalData(SomeClass someParam){
... do something
return listOfString;
}
}
现在我要测试:
给定一个特定的listOfString(由getExternalData 返回)和一个特定的metadatum(由db1Dao.get 返回):
-
我会得到想要的
listOfA吗? -
我可以调用
db2Dao.put,它的输入参数是listOfA吗?
特别是,我有硬编码示例listOfString 和metadatum 和所需的listOfA(它们将通过对象MockData 传递,请参见以下代码)但我不知道如何编写使用 Mockito 进行测试。以下是我写的一个测试类,但是不起作用:
class TestClass extends BaseTest {
@Mock
private Db1Dao db1Dao;
@Mock
private Db2Dao db2Dao;
private ExecuteClass executeClass;
@BeforeEach
public void setUp() {
MockitoAnnotations.initMocks(this);
executeClass = new ExecuteClass(db1Dao, db2Dao);
}
@ParameterizedTest
@MethodSource("MockDataProvider")
public void executeClassTest(final MockData mockData) throws PutException {
Mockito.when(db1Dao.get(Mockito.any(), ...))
.thenReturn(mockData.getMetadatum());
ExecuteClass executeClassSpy = Mockito.spy(executeClass);
Mockito.when(executeClassSpy.getExternalData(Mockito.any()))
.thenReturn(mockData.getListOfString());
executeClassSpy.execute();
// executeClass.execute(); not working neither...
List<A> listOfA = mockData.getDesiredListOfA();
Mockito.verify(db2Dao).put(listOfA);
}
}
谁能告诉我?提前谢谢你!
【问题讨论】: