为什么JMockit的@Injectable没有动态的部分模拟工作?

时间:2015-04-07 15:10:29

标签: unit-testing jmockit

在以下未记录Expectations的测试用例中,我希望动态部分模拟功能将用于AB字段,这些字段在{ {1}}使用UnitToTest。但相反,方法调用总是被模拟。仅使用无效的过滤器值进行静态部分模拟,可以调用实际方法:

@Injectable

对我而言,使用JMockit进行动态部分模拟似乎不适用于@Service class A { public String doSomething() { return "doSomething"; } public String doSomethingElse() { return "doSomethingElse"; } } @Service class B { public String doSomething() { return "doSomething"; } public String doSomethingElse() { return "doSomethingElse"; } } @Service class UnitToTest { @Autowired B b; @Autowired A a; public B getB() { return b; } public A getA() { return a; } } public class TestClass { @Tested UnitToTest unit; // @Mocked({ "someInvalidFilter()" }) @Injectable A a; // @Mocked({ "someInvalidFilter()" }) @Injectable B b; @Test public void test() { // actual return value is always null if no invalid static partial // mocking filters are specified above assertEquals("doSomething", unit.getA().doSomething()); assertEquals("doSomethingElse", unit.getA().doSomethingElse()); assertEquals("doSomething", unit.getB().doSomething()); assertEquals("doSomethingElse", unit.getB().doSomethingElse()); } } 。这是一个已知的限制吗?

1 个答案:

答案 0 :(得分:0)

假设可以找到匹配的字段或构造函数参数,

@Injectable总是被注入到@Tested个对象中;注入过程甚至考虑了DI注释,例如@Inject@Autowired

但是,@Injectable实例始终创建为未初始化(即没有状态)和完全模拟的实例。另一方面,部分模拟适用于您在测试中自己实例化(并初始化)的真实实例。

所以,你似乎要求的是所说的真实实例(部分嘲笑与否)可以注入@Tested个对象。实际上,这不受支持(除了通过调用Deencapsulation.setField),因为用户从未提供激励用例。

也就是说,如果更改为以下示例测试将通过:

public class TestClass {
    @Tested(fullyInitialized = true) UnitToTest unit;

    @Test
    public void test() {
        assertEquals("doSomething", unit.getA().doSomething());
        assertEquals("doSomethingElse", unit.getA().doSomethingElse());
        assertEquals("doSomething", unit.getB().doSomething());
        assertEquals("doSomethingElse", unit.getB().doSomethingElse());
    }
}

以上是集成测试,但不是单元测试。

相关问题