@InjectMocks在具有基元作为字段的类上

时间:2016-04-28 19:20:09

标签: java mockito

这是我的课我想嘲笑。

private MemcachedClient memcachedClient;

private CachedObjectFactory cachedObjectFactory;

private int cacheTimeToLive;

private boolean hasCert;

@Autowired
public MyClass(CachedObjectFactory cachedObjectFactory,
                         MemcachedClient memcachedClient,
                         @Value("${cache.ttl.in.second}") int cacheTimeToLive,
                         @Value("${hasCert}") boolean hasCert) {
    this.cachedObjectFactory = cachedObjectFactory;
    this.memcachedClient = memcachedClient;
    this.cacheTimeToLive = cacheTimeToLive;
    this.hasCert = hasCert;
}

当我使用@InjectMocks时,它抱怨它无法弄清楚如何使用默认构造函数初始化它(因为没有一个)。我认为mockito可以使用create this,但我不知道如何注入一个原语(boolean / cacheTimeToLive)。有没有办法在我的测试中做到这一点?

1 个答案:

答案 0 :(得分:4)

请参阅Mockito documentation

  
      
  1. 构造函数注入;选择最大的构造函数,然后使用在测试中声明的模拟来解析参数。如果使用构造函数成功创建了对象,则 Mockito不会尝试其他策略。如果有一个参数化的构造函数,Mockito决定不破坏对象   注意:如果找不到参数,则传递null。如果需要非可模拟类型,则构造函数注入不会发生。在这些情况下,您必须自己满足依赖关系。
  2.         

    [...]

         

    最后,在这种情况下,类型不会发生注入:

    public class ArticleManager {
        private ArticleDatabase database;
        private ArticleCalculator calculator;
    
        ArticleManager(ArticleObserver observer, boolean flag) {
            // observer is not declared in the test above.
            // flag is not mockable anyway
        }
    }
    

您必须自己满足依赖关系,例如使用JUnit' s @Before的设置方法。