首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JMockit的@Injectable不支持动态部分模拟?

为什么JMockit的@Injectable不支持动态部分模拟?
EN

Stack Overflow用户
提问于 2015-04-07 15:10:28
回答 1查看 2.2K关注 0票数 1

在没有记录Expectations的下面的测试用例中,我预计动态部分模拟特性将用于使用@InjectableUnitToTest中初始化的字段AB。但是,方法调用总是会被模拟。只有对静态部分模拟使用无效的筛选值,才能调用真正的方法:

代码语言:javascript
复制
@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进行动态部分模拟似乎不适用于@Injectable。这是已知的限制吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 16:05:35

假设可以找到匹配的字段或构造函数参数,@Injectable总是被注入到@Tested对象中;注入过程甚至考虑到DI注释,如@Inject@Autowired

但是,@Injectable实例总是作为未初始化的(即没有状态)和完全模拟的实例创建的。另一方面,部分模拟是针对在测试中实例化(并初始化)的实例。

因此,您似乎要求的是,可以将实际实例(部分模拟与否)注入到@Tested对象中。事实上,这是不受支持的(除了调用Deencapsulation.setField),因为用户从来没有提供过一个有动机的用例。

尽管如此,如果将示例测试更改为以下内容,则示例测试将通过:

代码语言:javascript
复制
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());
    }
}

上面的测试是集成测试,而不是单元测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29494959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档