如何模拟Jmokit 1.49版本中的私有方法



我使用Junit 3.8.1,并将Jmokit更新为1.49

我有一个项目,其中现有的测试与实物模型。嘲笑私人方法。在将Jmockit jar更新到1.49版本后,出现如下错误

java.lang.IllegalArgumentException: Unsupported fake for private method

我要测试的Java类是

public class Foo {
String aVar;
public Foo(String str) {
aVar = str;
}
private void concatStr(String append) {
aVar = aVar.concat(append);
}
public void doSomeTask() {
concatStr("Test");
}
}

测试等级为

public class FooTest extends TestCase {
public FooTest(String testName) {
super(testName);
}
public static Test suite() {
return new TestSuite(FooTest.class);
}
public void test() {
new MockUp<Foo>() {
@Mock
private void concatStr(String append) {
Assert.assertEquals("Test", append);
}
};
Foo foo = new Foo("demoString");
foo.doSomeTask();
}
}

控制台上出现错误,如下

[INFO] Running org.test.jmokitupdate.FooTest
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.028 s <<< FAILURE! - in 
org.test.jmokitupdate.FooTest
[ERROR] test(org.test.jmokitupdate.FooTest)  Time elapsed: 0.025 s  <<< ERROR!
java.lang.IllegalArgumentException: Unsupported fake for private method 
Foo#concatStr(Ljava/lang/String;)V found
at mockit.internal.faking.FakedClassModifier.visitMethod(FakedClassModifier.java:96)
at mockit.asm.methods.MethodReader.readMethodBody(MethodReader.java:118)
at mockit.asm.methods.MethodReader.readMethod(MethodReader.java:75)
at mockit.asm.methods.MethodReader.readMethods(MethodReader.java:62)
at mockit.asm.classes.ClassReader.readFieldsAndMethods(ClassReader.java:196)
at mockit.asm.classes.ClassReader.accept(ClassReader.java:89)
at mockit.internal.faking.FakeClassSetup.modifyRealClass(FakeClassSetup.java:80)
at mockit.internal.faking.FakeClassSetup.redefineMethods(FakeClassSetup.java:61)
at mockit.MockUp.redefineClass(MockUp.java:114)
at mockit.MockUp.<init>(MockUp.java:78)
at org.test.jmokitupdate.FooTest$1.<init>(FooTest.java:31)
at org.test.jmokitupdate.FooTest.test(FooTest.java:31)

早期版本的JMockit允许对私有方法进行嘲讽,老实说,我认为它与其他嘲讽框架有很大的区别。遗憾的是,最近的版本已经取消了嘲笑私兵的功能——在1.45中成为警告,在1.47中成为例外。

并没有真正的官方解释,尽管假设私有方法应该非常简单,不需要测试/嘲笑。通过扩展,如果您试图出于测试目的访问它,那么它不应该是私有的。人们(除了你(可能也想改变行为,而你出于测试目的访问它的需求强烈表明该方法应该是可访问的。将其设为受保护或打包为私有。FWIW@VisibleForTesting";其可用于帮助指示意图。

所以你知道,1.47也删除了";去胶囊化";机制,这是我最喜欢的检查/设置私人数据的工具之一。当时我不得不转换,因为它乱丢了我的测试代码,这很痛苦,但事后看来,@Tested/@Injectable(替换(要干净得多。正如维护人员所指出的,JMockit并不是一种进入私有化的方式,还有其他框架可以做到这一点,而且在做他们做得更好的工作时毫无意义。我切换到Apache的commons-lang3(FieldUtils/MethodUtils/etc(,但存在其他框架

最新更新