Mocking HystrixObservableCommand导致调用real.toObservable()



我有一个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工作正常。

相关内容

  • 没有找到相关文章