1

假设我想Foo.doSomething(String arg):String使用EasyMock测试一个方法。我知道我可以使用EasyMock Capture来捕获参数内部设置的值,然后再获取它。在编写测试时,我的目标是在模拟 Foo 的方法时捕获值,然后在我的模拟方法之外获取捕获的值。我正在尝试这样的事情:

Capture<String> stringCapture = new Capture<String>();
EasyMock.expect(foo.doSomething(EasyMock.capture(stringCapture)).andAnswer(new IAnswer<String> {
    @Override
    public String answer() throws Throwable {
        ...
});
String retrievedValue = stringCapture.getValue();

但是,当我尝试使用时出现运行时错误getValue()

java.lang.AssertionError: Nothing captured yet
    at org.easymock.Capture.getValue(Capture.java:80)
    at com.example.Test.myTest(...)
    ....

我希望我可以String在我的测试方法中但在IAsnwer闭包之外有一个变量,并在我的方法中设置该变量的值IAnswer.answer()。问题是String变量必须标记为final才能被闭包访问,这使得它无法修改,因此无用。另外,我不希望使用全局来解决这个问题。

我想到的唯一解决方法是使用我自己的具有 String 字段的类,将其声明为final外部的变量IAnswer,在期间设置捕获的值answer(),最后将此值设置为我的测试方法中的字段。也许有更好的方法来做到这一点,因为使用另一个类来提取捕获的值,甚至是全局变量,对我来说似乎很难看。

4

1 回答 1

2

getValue 仅在实际(重放)调用 foo 之后才起作用。在此之前,什么都不是捕获。

为了在 answer() 中设置一个变量,因为 Java 要求内部类中使用的变量是 final 的,所以我通常使用 AtomicReference。这是一个很好的占位符。AtomicReference 是最终的,但它的内容不是。

于 2012-12-25T16:06:24.917 回答