2017-05-20 247 views
0

我试图使用mockito来验证方法是否被调用。这里有一个例子:Mockito验证方法调用一次

@Test 
public void t(){ 
    InvokedFromTest ift = mock(InvokedFromTest.class); 
    TestClass t = new TestClass(); 
    t.ift = ift; 

    t.mm(new String(ByteBuffer.allocate(4).put("123".getBytes()).array())); 
    verify(ift, times(1)).m("123"); 
} 

private static class TestClass{ 
    public InvokedFromTest ift; 
    public void mm(String s){ ift.m(s); } 
} 

private static class InvokedFromTest{ 
    public void m(String s){} 
} 

但运行过程中出现t()时,我得到以下异常:

Argument(s) are different! Wanted: 
invokedFromTest.m("123"); 
-> at com.pack.age.TableRowIgniteProcessingLogicTest.t(TableRowIgniteProcessingLogicTest.java:62) 
Actual invocation has different arguments: 
invokedFromTest.m("123"); 
-> at com.pack.age.TableRowIgniteProcessingLogicTest$TestClass.mm(TableRowIgniteProcessingLogicTest.java:67) 

为什么?为什么我得到这个错误?如何使这个测试按预期工作?

回答

1

您正在分配一个长度为4的字节缓冲区,而只存储3个数字(每个长度为1个字节)。将这个字节数组传递给String的构造函数,创建一个最后一个字符为\ u0000(byte = 0)的4个字符的字符串。使用ByteBuffer.allocate(3)

+0

哈,但为什么是另一个字符串?信息非常不清楚。 –

+1

因为您正在使用长度为4的字节数组初始化字符串。最后一个字节保持为零。尝试调试字符串的创建,你会看到它的长度为4个字符。 –

相关问题