java - EasyMock捕获: use getValue() outside of an IAnswer

标签 java unit-testing mocking capture easymock

假设我想使用 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/

相关文章:

java - 在 Java 中分割字符串,并在字符串部分中使用潜在的分割字符

unit-testing - CMake 和 CTest 的默认 "test"命令会跳过特别命名的测试

visual-studio - 如何在 Visual Studio 中分别在不同文件夹/项目中运行(单元)测试?

unit-testing - 你如何说服别人编写单元测试?

java - 为什么 Mockito 的 mock 在应该返回 null 时返回 0?

java - 将 http 407 错误作为 IOException

java - 如何将 String 映射到 Java 类?

java - 如何读取 .txt 文件并每 8 个字符分割一次?

php - 为什么 phpunit 不在模拟类中运行 __destruct() 以及如何强制运行它?

java - 如何使用 Mockito 通过私有(private)方法调用测试 void 方法