小编hvt*_*vth的帖子

如何使用EasyMock模拟从抽象类继承的方法?

我正在与EasyMock挣扎.我写了两个小班来说明我的问题:

public abstract class A {
    private AtomicReference<Integer> id = new AtomicReference<Integer>(null);
    public final int getId() {
        return id.get();
    }
    public final boolean setId(int id) {
        return this.id.compareAndSet(null, id);
    }
}

public class B extends A {
}
Run Code Online (Sandbox Code Playgroud)

然后我继续写一个测试方法如下:

public class EasyMockTester extends EasyMockSupport {
    @Test
    public void test() {
        B b = EasyMock.createStrictMock(B.class);
        EasyMock.expect(b.getId()).andReturn(100);
        replayAll();
        int id = b.getId();
        System.out.println("The ID is: " + id);
        verifyAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我希望EasyMock简单地模拟一个B类实例(我的实际类不是空的,而是为从抽象类继承的方法添加更多方法).相反,EasyMock实际上会进入A类的代码并开始抱怨NullPointerException.如何让EasyMock模拟扩展抽象类的类?

当我运行此测试时,我得到以下故障跟踪:

在显示java.lang.NullPointerException com.my.project.package.tests.A.getId(A.java:9)在com.my.project.package.tests.EasyMockTester.test(EasyMockTester.java:11)​​在阳光下.在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)的java.lang.reflect.Method.invoke上的reflect.NativeMethodAccessorImpl.invoke0(Native Method) Method.java:597)在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:44)在org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)的组织.在org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner)的org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)中的junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41). java:79)org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)at org.junit.runners.BlockJUnit4Class Runner.runChild(BlockJUnit4ClassRunner.java:49)在org.junit.runners.ParentRunner …

java extends easymock class abstract

5
推荐指数
1
解决办法
4331
查看次数

处理通常无法返回有效结果的 CompletableFuture 的 Java 8 惯用方法是什么?

假设我们正在调用一个缓慢的远程服务来获得String响应。为此,我们调用了一个如下所示的方法:

public CompletableFuture<String> getSlowly(String param) {...}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们也知道我们知道该服务在我们调用它的 20% 的时间内不会返回有用的响应。因此,在我们调用的 20% 的情况下,getSlowly我们会得到一个异常完整的未来,并带有一些包装异常。意思是,我们将catch在以下调用的块中结束:

try {
    String response = getSlowly("some input").join();
    doSomething(response); // 80% succeed
catch (Exception e) {
    LOG.warn("Couldn't get response. Too bad."); // 20% fail
}
Run Code Online (Sandbox Code Playgroud)

这个调用并不重要,我们的应用程序可以优雅地处理丢失的响应。但是,每当我们设法成功获得响应时,我们确实希望使用响应。

因为我们知道这种失败会经常发生,即我们确实预料到了,将这 20% 的调用视为例外是否有意义?

不将 20% 视为例外的一种方法是将 的实现更改为getSlowly以下内容:

public CompletableFuture<Optional<String>> getSlowly(String param) {...}
Run Code Online (Sandbox Code Playgroud)

这看起来很笨拙。

有没有一种惯用的方式来处理这种脆弱的 CompletableFutures?当缺少返回值时,我们应该将其视为异常状态,还是应该返回可选项(或类似的自定义对象)?

java exception-handling optional java-8 completable-future

5
推荐指数
0
解决办法
544
查看次数