当模拟java.nio.ByteBuffer类时出现java.lang.UnsupportedOperationException异常

6

我正在尝试使用Mockito在JUnit中对Java.nio的ByteBuffer类进行模拟测试。我遇到了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”。您应该为其分配一个非空缓冲区。 - Alex
3
为什么要嘲笑它?只需要通过包装getBytes返回的数组来创建它即可。 - Sotirios Delimanolis
@Alex 如果我在模拟对象,我如何给它分配一个非空缓冲区? - krackoder
2个回答

9

就像来自Sotirios Delimanolis的评论所说,您不需要模拟这个类或者那些由原始类型如byte []组成的类。

除了模拟之外,还有许多不同的测试替身(伪造、间谍等),这是使用伪造对象而不是模拟对象更好的情况。

只需使用:

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

是的,那很有道理。教训就是不要过度模拟对象。 - krackoder

4

您会收到一个java.lang.UnsupportedOperationException的异常提示,因为ByteBuffer.array()是一个final方法,Mockito无法对其进行模拟。这意味着:

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

调用实际方法并引发异常。

2
这个解释有助于理解根本原因。 - krackoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接