假设我想使用 EasyMock 测试方法 Foo.doSomething(String arg):String
。我知道我可以使用 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
闭包之外,并在我的 IAswer.answer( )
方法。问题是 String
变量必须标记为 final
才能被闭包访问,这使得它不可修改,因此无用。另外,我不想仅仅使用全局来解决这个问题。
我想到的唯一解决方法是使用我自己的具有 String 字段的类,将其声明为 IAnswer
外部的 final
变量,设置捕获的answer()
期间的值,最后将该值设置到我的测试方法中的一个字段中。也许有更好的方法来做到这一点,因为使用另一个类来提取捕获的值,甚至是全局变量,对我来说似乎很难看。
最佳答案
getValue 仅在实际(重播)调用 foo 后才起作用。在此之前,没有任何捕获。
要在answer()中设置变量,由于Java要求内部类中使用的变量是final的,我通常使用AtomicReference。对于此类事情来说,这是一个很好的占位符。 AtomicReference 是最终的,但其内容不是最终的。
关于java - EasyMock捕获: use getValue() outside of an IAnswer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13977343/