微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从Jmokit 1.49版本模拟私有方法

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

我有一个项目,其中的现有测试与MockUp一起提供。嘲笑私有方法。将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),但是存在其他框架

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。