我有一个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网址:com.netflix.hystrix.AbstractCommand.toObservable(AbstractCommand.java:342)网址:com.netflix.hystrix.HystrixObservableCommand.toObservable(HystrixObservableCommand.java:35)
为什么real.toObservable()不断被调用?设置断点表明正在创建的LoginWithEmailCommand对象是一个生成的代理对象。。。
另一个线索:如果我把这个覆盖添加到ObservableCommand中,嘲讽就起作用了:
@Override
public Observable<Boolean> toObservable() {
return super.toObservable();
}
有没有比必须放入未使用的toObservable重写更干净的方法来实现这一点?
到目前为止,这是我的解决方案——也许有一种更干净的方法。。。
步骤1:在我的包中创建一个新的BaseCommand:
public abstract class BaseCommand<T> extends HystrixObservableCommand<T> {
// protected ctors go here
@Override
public Observable<T> toObservable() {
return super.toObservable();
}
}
第二步:从这个基地扩展我的命令。
public class LoginWithEmailCommand extends BaseCommand<Boolean> {
// stuff...
}
现在mock工作正常。