【发布时间】:2019-09-10 12:22:29
【问题描述】:
我正在尝试将间谍注入私有字段private Map<Integer, IPatron> patrons;,但没有成功。该字段不属于任何构造函数,也不具有任何 setter 或 getter。如果可能,我会尽量避免更改源代码。
如果该字段设置为公共,我可以显式分配间谍,但据我了解它应该自动发生。
package library;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import library.entities.IPatron;
import library.entities.Library;
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT) // allows unnecessary "stubbing"
class TestTing{
@Spy
private Map<Integer, IPatron> patrons;
@Spy
@InjectMocks
Library library;
@BeforeEach
void setUp(){
}
@Test
void getPatronList(){
library.getPatronList();
//someTest
patrons.size();
}
}
private Map<Integer, IPatron> patrons;
public Library() {
patrons = new HashMap<>();
}
@Override
public List<IPatron> getPatronList() {
return new ArrayList<IPatron>(patrons.values());
}
我的理解是@Spy private Map<Integer, IPatron> patrons;会在被测类中找到private Map<Integer, IPatron> patrons;并替换掉。
【问题讨论】:
-
为什么你认为它不起作用?
-
@second 在运行时检查该字段会显示一个普通的 HashMap 对象,而不是模拟注入的 HashMap。
-
你用的是什么mockito版本?当我使用 v3.0.0 验证这一点时,调试显示模拟已正确注入,并且您的测试的(更完整)版本返回了我为模拟指定的结果。 -- 无论如何做@MarkBramnik 建议的改变是更干净的方式。