【发布时间】:2015-04-07 15:10:28
【问题描述】:
在下面没有记录Expectations 的测试用例中,我希望动态部分模拟功能将用于A 和B 字段,它们在UnitToTest 中使用@Injectable 初始化.但相反,总是模拟方法调用。只有对静态部分模拟使用无效的过滤器值,才能调用真正的方法:
@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());
}
}
对我来说,使用 JMockit 进行动态部分模拟似乎不适用于 @Injectables。这是已知的限制吗?
【问题讨论】:
-
示例测试中没有动态部分模拟;为此,您需要有一个“new Expectations(a, b) { ... }”期望记录块。但是“a”和“b”应该是真实的实例,而不是模拟的实例。
-
感谢您的回答。然而,这意味着没有依赖注入可用。相反,我将不得不使用 Deencapsulation.setField()。是否计划扩展 Mocking 框架以支持
@Injectables 的部分动态模拟?或者至少我可以在以后的版本中依赖上述解决方法的支持吗? -
部分模拟和@Injectable 的注入是模拟API 的两个完全不同的部分。我不认为我明白你想说什么;如果你能解释一下你实际上要测试的是什么,那就容易多了。
-
这个想法是使用
@Injectables 作为@Autowired字段来简化单元测试。并且仅当Expectations被记录或使用Mockup时,我希望现有的行为被嘲笑。如果不使用这些,我将依赖真实方法的调用。所以在上面的测试用例中调用A或B的方法,应该使用真正的方法。
标签: unit-testing jmockit