【问题标题】:Mocking HystrixObservableCommand results in real .toObservable() getting called模拟 HystrixObservableCommand 会导致真正的 .toObservable() 被调用
【发布时间】:2016-08-12 01:30:22
【问题描述】:

我有一个想要使用 Mockito 模拟的 HystrixObservableCommand:

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)

为什么真正的 .toObservable() 不断被调用?设置断点表明正在创建的 LoginWithEmailCommand 对象是生成的代理对象...

另一个线索:如果我将此覆盖添加到 ObservableCommand 中,则可以模拟:

@Override
public Observable<Boolean> toObservable() {
    return super.toObservable();
}

...有没有比放置未使用的 toObservable 覆盖更清洁的方法来完成这项工作?

【问题讨论】:

标签: unit-testing mockito observable hystrix


【解决方案1】:

到目前为止,这是我的解决方案-也许有更清洁的方法...

第 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...
} 

现在模拟可以正常工作了。

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多