【问题标题】:java.lang.UnsupportedOperationException when mocking java.nio.ByteBuffer class模拟 java.nio.ByteBuffer 类时出现 java.lang.UnsupportedOperationException
【发布时间】:2017-11-01 01:40:49
【问题描述】:

我正在尝试使用 Mockito 模拟 java.nio 中的 ByteBuffer 类,以便在 JUnit 中进行测试。我收到了java.lang.UnsupportedOperationException

我的代码看起来像 -

class TestClass {

    @Mock
    private ByteBuffer byteBuffer

     @Before
     public void setup() {
         Mockito.when(byteBuffer.array()).thenReturn("some-string".getBytes()); //this line throws java.lang.UnsupportedOperationException
     }
}

我应该如何模拟数组方法才能使其工作?我正在使用 Java 8。

【问题讨论】:

  • javadoc 中指出,如果此缓冲区不受可访问数组的支持,则会抛出 UnsupportedOperationException。您应该为其分配一个非空缓冲区。
  • 为什么要嘲笑它?只需通过包装 getBytes 返回的数组来创建它。
  • @Alex 如果我在模拟对象,我如何为它分配一个非空缓冲区?

标签: java unit-testing junit mockito


【解决方案1】:

就像Sotirios Delimanolis 的评论一样,您不需要模拟这个类或由byte [] 等原语轻松组成的类。

除了模拟之外,还有许多不同的test doubles(假货、间谍等),这比模拟货更适合假货。

只需使用:

byteBuffer = ByteBuffer.wrap("some-string".getBytes());

【讨论】:

  • 是的,这是有道理的。经验教训 - 不要过度模拟对象。
【解决方案2】:

你会得到一个java.lang.UnsupportedOperationException,因为ByteBuffer.array() 是一个final 方法。因此它不会被 Mockito 嘲笑。这意味着

Mockito.when(byteBuffer.array()).thenReturn("some-string".getBytes());

调用引发异常的真实方法。

【讨论】:

  • 这个解释有助于理解根本原因。
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多