使用JNI

时间:2016-09-22 21:40:59

标签: java unit-testing java-native-interface jmockit

我正在调查以下情况导致NoClassDefFoundError的原因,其中涉及使用jmockit和JNI。

这是课程:

MyJNI.class

class MyJNI {
    MyJNI() {}
    public static final native int getInt();
}

MyTestInterface.class

public interface MyTestInterface {
    int INT_FROM_JNI = MyJNI.getInt();
}

MyTestImp.class

public class MyTestImp implements MyTestInterface {
    public MyTestImp() {}
}

DummyTest.java

@RunWith(JMockit.class)
public class DummyTest {
    @Mocked
    MyTestInterface myTest;  

    @Test
    public void dummy() { assertTrue(true); }
}

FailingTest.java

@RunWith(JMockit.class)
public class FailingTest {
    @Mocked
    MyTestImp myTest;  

    @Test
    public void shouldPass() { assertTrue(true); }
}

如果我们按顺序运行DummyTest.java和FailingTest.java(顺序很重要),则FailingTest.java中的测试将失败,并显示错误消息“java.lang.NoClassDefFoundError:xxx.xxx.xxx.MyTestInterface”。

具体而言,以下任何更改都会更正错误:

(a)以相反的顺序运行测试:FailingTest.java然后DummyTest.java

(b)在“DummyTest.java”中,更改“MyTestInterface myTest;”到“MyTestImp myTest;”

(c)在“MyTestInterface.class”中,更改“int INT_FROM_JNI = MyJNI.getInt();” to“int INT_FROM_JNI = 1;”。

(d)在“FailingTest.java”中,更改“MyTestImp myTest;”到“MyTestInterface myTest;”

我找不到一个好的解释。在这种情况下,单元测试不再是独立的。看起来在场景模拟MyTestInterface在尝试使用MyJNI时会导致其他测试文件出现问题,并且在这种情况下会导致在运行时找不到MyTestInterface。

任何人都有任何解释这个问题的线索?谢谢!

0 个答案:

没有答案