java - 测试调用 native 方法的代码

标签 java junit easymock mockito powermock

我有这样一个类:

public final class Foo
{
    public native int getBar();

    public String toString()
    {
        return "Bar: " + getBar();
    }
}

请注意,getBar() 是使用 JNI 实现的,并且该类是final。我想编写一个 junit 测试来测试 toString() 方法。为此,我需要模拟 getBar() 方法,然后运行原始的 toString() 方法来检查输出。

我的第一个想法是这一定是不可能的,但后来我发现了PowerMock它支持根据功能列表测试最终类和 native 方法。但到目前为止,我没有成功。我做的最好的事情是模拟整个类,但随后测试测试了模拟的 toString() 方法而不是真正的方法,这没有多大意义。

那么我如何使用 PowerMock 从上面测试这个 toString() 方法呢?我更喜欢将 PowerMock 与 Mockito 一起使用但如果这是不可能的,我使用 EasyMock 没有问题相反。

最佳答案

找到了。我这样做的方式是正确的。我唯一错过的是在调用 toString() 时告诉模拟对象调用原始方法。所以它是这样工作的:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Foo.class })
public class FooTest
{
    @Test
    public void testToString() throws Exception
    {
        Foo foo = mock(Foo.class);
        when(foo.getBar()).thenReturn(42);
        when(foo.toString()).thenCallRealMethod();
        assertEquals("Bar: 42", foo.toString());
    }
}

关于java - 测试调用 native 方法的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4916217/

相关文章:

java - ReentrantLock 与 CPU 级别同步?

java - 如何使用 Scribe POST json 或对象的内容?

java - 使用 Mockito 进行单元测试时出现空指针

java - 在使用 junit 进行测试期间,Android 处理程序为空

java - 等价于 EasyMock 中的 LastCall.IgnoreArguments

java - PowerMock/EasyMock : Set expectation on final method that would throw exception

JavaFX - 使用 mediaplayer 和 mediaview 播放视频

java - KeyListener - 我需要在主程序中调用 keyPressed 方法吗?

java - 用不同的参数模拟相同的方法

android - Android 中的单元测试私有(private)函数