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



这是我试图模拟的类。

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 可以使用创建这个,但我不知道如何注入一个原语(布尔值/缓存时间到生活)。 有没有办法在我的测试中做到这一点?

参见 Mockito 文档:

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

[...]

最后,在这种情况下,不会对类型进行注入:

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 的@Before设置方法。

最新更新