我试图测试一个进行方法调用的类,并通过一个监听器等待响应。
这些是交互器内的接口。当我调用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
,所以我需要模拟Interactor回调
我尝试过不同问题的不同解决方案,所以现在我没有最终的代码或错误。但没有人工作..
谢谢。
答案 0 :(得分:2)
假设您正在测试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
答案 1 :(得分:1)
Dimitry的方法很好,我个人不会打电话,因为你的onAsyncroouTaskResponse()
是公开的,我会打电话给verify(yourmock).onError()
或者类似的确定它被称为。
我有时采用的另一种方法是创建一个&#34; TestableSubject&#34;这只是一个class extends YourOriginalClass
,您可以覆盖某些方法并保持其被调用的次数或类似值。有时候,由于某些课程的性质,你不能嘲笑它们(最终的,抽象的东西,私人的等等)。
如果您想要(也许应该)测试的是,在完成异步任务后,将调用您的回调(无论结果如何),然后我跳过获取部分,您可以测试该获取在另一个测试中解雇了这个工作,但我想在这里你对后面的部分更感兴趣。