我正在尝试测试一个类,该类可以调用一个方法,然后从响应中等待听众。
这些是交互式内部的接口。当我调用 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
}
}
这就是我的课程的方式。我需要测试MyClass
,所以我需要模拟互动器回调
我尝试了不同的问题,所以现在我没有最终代码或错误。但是没有人可以工作..
谢谢。
假设您正在测试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()
是公开的,我会称之为verify(yourmock).onError()
或类似于确保它被称为。
有时我做出的另一种方法是创建一个" TestableSubject",它只是class extends YourOriginalClass
,您可以在其中覆盖某些方法并保留其称为或类似的次数的数量。有时,由于某些课程的性质,您无法嘲笑它们(最终,抽象的东西,私人等)。
如果您想要的(也许应该)测试是在完成异步任务后,请回电(无论结果如何),那么我会跳过获取部分在另一项测试中的工作,但我认为您在后面的一部分更感兴趣。