模拟HystrixObservableCommand导致真正的.toObservable()被调用

时间:2016-04-19 17:41:51

标签: unit-testing mockito observable hystrix

我有一个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覆盖放入?

1 个答案:

答案 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...
} 

现在模拟工作正常。