在以下未记录Expectations
的测试用例中,我希望动态部分模拟功能将用于A
和B
字段,这些字段在{ {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());
}
}
。这是一个已知的限制吗?
答案 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());
}
}
以上是集成测试,但不是单元测试。