我有一个HystrixObservableCommand,我想用Mockito嘲笑:
public class LoginWithEmailCommand extends HystrixObservableCommand<Boolean> {
// stuff...
}
使用如下所示的测试:
@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {
@Mock
Observable<Result> mockObs;
@Test
public void mockwtf() {
LoginWithEmailCommand cmd = mock(LoginWithEmailCommand.class);
when(cmd.toObservable()).thenReturn(mockObs);
cmd.toObservable();
}
}
但是,运行此测试会导致NullPointerException:
显示java.lang.NullPointerException at com.netflix.hystrix.AbstractCommand.toObservable(AbstractCommand.java:342) at com.netflix.hystrix.HystrixObservableCommand.toObservable(HystrixObservableCommand.java:35)
为什么真正的.toObservable()会被调用?设置断点显示正在创建的LoginWithEmailCommand对象是生成的代理对象...
另一个CLUE:如果我将此覆盖添加到ObservableCommand中,则模拟工作:
@Override
public Observable<Boolean> toObservable() {
return super.toObservable();
}
...有没有更简洁的方法来完成这项工作,而不是将未使用的toObservable覆盖放入?
答案 0 :(得分:0)
到目前为止,这是我的解决方案 - 或许有一种更清洁的方式......
步骤1:在我的包中创建一个新的BaseCommand:
public abstract class BaseCommand<T> extends HystrixObservableCommand<T> {
// protected ctors go here
@Override
public Observable<T> toObservable() {
return super.toObservable();
}
}
步骤2:改为从此基础扩展我的命令。
public class LoginWithEmailCommand extends BaseCommand<Boolean> {
// stuff...
}
现在模拟工作正常。