我正在调查以下情况导致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。
任何人都有任何解释这个问题的线索?谢谢!