【问题标题】:How can I apply an @Injectable Class object to the constructor of a @Tested class?如何将@Injectable Class 对象应用于@Tested 类的构造函数?
【发布时间】:2016-05-17 17:44:01
【问题描述】:

考虑以下“生产”代码:

public class Foo<T extends Number> {

    private Bar delegate;
    private Class<T> numberClass;

    public Foo(Class<T> numberClass) {
        this.numberClass = numberClass;
    }

    public T doSomething() {
        if (numberClass==Integer.class) {
             return delegate.getIntValue();
        } else if (numberClass==Float.class) {
             return delegate.getFloatValue();
        } else if (numberClass==Double.class) {
             return delegate.getDoubleValue();
        }  // etc etc etc
        return null;
    }
}

这是基于我所面临的真实情况...我无法控制委托对象的实现。

那么,如何使用 JMockit @Tested 注释对此类进行单元测试?我不能使用@Injectable 注入Class 值...它抱怨Class 不可模拟。而且我不是要嘲笑它,只是注入它。与字符串、原语或枚举不同,我可以说 @Injectable("foobar") String s; 并获得一个非模拟的可注入对象,这些语义不适用于 Class 对象。

显然,我的解决方法是在 @Before 方法中手动构建我的 Foo,所以我会这样做。但我不禁觉得 JMockit 应该可以解决这种情况。

【问题讨论】:

    标签: java jmockit


    【解决方案1】:

    简而言之,您不能使用@Tested,因为jmockit 不允许您模拟Class 类。您必须编写类似这样的测试:

    @Test
    public void testDoSomethingWithInteger(@Mocked final Bar bar) {
        final int expectedValue = 10;
    
        new NonStrictExpectations() {
            {
                bar.getIntValue();
                result = expectedValue;
            }
        };
    
        Foo foo = new Foo(Integer.class);
        assertEquals(expectedValue, foo.doSomething());
    }
    

    我认为限制模拟核心 java 类的原因是模拟此类类可能对执行 java 产生不利影响,因为核心类通常会影响您的大部分代码。这个SO answer 遵循类似的思路或推理。

    或者它可能与类加载器中类的加载方式有关。我确实读过a blog post,它声称通过使用以下命令行参数启动您的测试 jvm 来模拟核心类:-Xbootclasspath/a:jmockit.jar: -javaagent:jmockit.jar

    【讨论】:

    • 我了解这些限制及其原因。我想我只是在寻求一种方法来构造函数注入而不模拟。具有讽刺意味的是,现场注入会更容易(使用Deencapsulation)......
    • 我认为我上面的示例在没有模拟的情况下完成了构造函数注入。所有@Tested@Injectable 注释所做的都是使用与可注入变量匹配的构造函数并使用指定的值来实例化Foo。然而,根据jmockit api,可注入变量实际上是模拟实例:“与常规@Mocked 类型的模拟实例相比,可以说这样的实例是适当的模拟对象。”在上面的示例中,唯一的模拟是 Bar 类。
    • 此外,如果您不想要,您甚至不必模拟 Bar 类,尽管这会使测试成为集成测试而不是单元测试。
    猜你喜欢
    • 2023-04-05
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多