Android 使用Mockito模拟回调和侦听器
我试图测试一个类,它进行方法调用并通过侦听器等待响应 这些是交互器内部的接口。当我调用Android 使用Mockito模拟回调和侦听器,android,mockito,Android,Mockito,我试图测试一个类,它进行方法调用并通过侦听器等待响应 这些是交互器内部的接口。当我调用fetch时,一个侦听器函数被回调 interface Interactor { void fetch(int offset, int size); } interface InteractorListener { void onReady(List<Result> results); void onError(); } public class MyInteracto
fetch
时,一个侦听器函数被回调
interface Interactor {
void fetch(int offset, int size);
}
interface InteractorListener {
void onReady(List<Result> results);
void onError();
}
public class MyInteractor implements Interactor{
private ImageInteractorListener listener;
public MyInteractor() {}
public onAttach(ImageInteractorListener listener) {
this.listener = listener;
}
public void fetch(int offset, int size) {
// Make asyncrhonous task
// and manage the response in the next method
}
public void onAsyncroouTaskResponse() {
if (someChecks) {
listener.onReady(List<Result> results);
} else {
listener.onError();
}
}
}
public class MyClass implements ImageInteractorListener {
public MyClass() {
MyInteractor interactor = new Interactor();
interactor.onAttach(this);
interactor.fetch(1,1);
}
@Override
void onReady(List<Result> results) {
// doThings
}
@override
void onError() {
// doThings
}
}
接口交互器{
无效提取(整数偏移量、整数大小);
}
接口交互列表器{
void onReady(列出结果);
void onError();
}
公共类MyInteractor实现了Interactor{
私有ImageInteractiorListener侦听器;
公共MyInteractor(){}
公共onAttach(ImageInteractitorListener侦听器){
this.listener=listener;
}
公共无效获取(整数偏移量、整数大小){
//进行异步任务
//并在下一种方法中管理响应
}
SyncRooutAskResponse()上的公共无效{
如果(某些支票){
onReady(列出结果);
}否则{
listener.onError();
}
}
}
公共类MyClass实现ImageInteractiorListener{
公共MyClass(){
MyInteractor interactor=新的interactor();
interactior.onAttach(这个);
interactior.fetch(1,1);
}
@凌驾
void onReady(列出结果){
//多思
}
@凌驾
void onError(){
//多思
}
}
这就是我的课程是如何制作的。我需要测试MyClass
,所以我需要模拟交互器回调
// Test that errors are handled
// Given
Interactor interactor = mock(Interactor.class);
MyClass myClass = new MyClass(interactor);
// When
interactor.fetch(0, 0); // this call is optional, I just added it for clarity
myClass.onError();
// Then
// verify something
我用不同的问题尝试了不同的解决方案,所以现在我没有最终的代码或错误。但是没有人工作
谢谢。假设您正在测试
MyClass
,您可以手动调用回调函数
// Test that errors are handled
// Given
Interactor interactor = mock(Interactor.class);
MyClass myClass = new MyClass(interactor);
// When
interactor.fetch(0, 0); // this call is optional, I just added it for clarity
myClass.onError();
// Then
// verify something
Dimitry的方法很好,我个人不会调用fetch,因为您的
onAsyncroouTaskResponse()
是公共的,我会调用它,然后验证(yourmock).onError()
或类似的方法来确保它被调用
我有时会采用的另一种方法是创建一个“TestableSubject”,它只是一个扩展了原始类的类,在这个类中重写某些方法并记录调用它的次数,或者类似的方法。有时,由于某些类的性质,您不能全部模仿它们(final、abstract、private等)
如果您想要(或者应该)测试的是,在异步任务完成后,您的回调将被调用(无论结果如何),那么我将跳过fetch部分,您可以在另一个测试中测试fetch是否触发作业,但我认为您更感兴趣的是后面的部分 我不确定我是否理解您的类层次结构。您有一个“类”,它在交互器上调用获取
。此interactitor
有一个类型为interactitorlistener
的成员,您想验证调用fetch后该成员中是否调用了onReady
或onError
?我添加了示例代码。非常感谢。确切地说-如果MyClass
是正在测试的类,则不能对其进行模拟(否则测试将毫无意义)。但在您的示例中,您是在模拟MyClass,而在我的示例中,我只是在模拟Interactior
<代码>MyClass
未被模拟。