我正试图把一个间谍注入私人领域的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;并替换它。
发布于 2019-09-10 12:29:24
首先,您对Library类进行了正确的测试,所以它不是间谍或任何东西,它只是一个常规实例,因此您应该在测试中创建它,如下所示:
Library underTest = new Library(...);现在,您的问题的答案不是关于Mockito,而是关于使代码单元可测试的问题。
没有任何生成的代码是自动单元可测试的。
正如现在编写的类Library一样,这是不可能的(除非您强行设置用户的反射)。反思也不是这样做的好方法。
我建议使用依赖注入原则并重构如下代码:
class Library {
private Map<Integer, IPatron> patrons;
public Library(Map<Integer, IPatron> patrons) {
this.patrons = patrons;
}
}然后,在测试中,您可以创建patrons作为一个映射,作为一个间谍,模拟或任何您想要模拟真实的交互,并注入到Library
Library underTest = new Library(patrons);发布于 2019-09-10 12:29:26
库类中的硬代码赞助者依赖项。不要使用硬编码。
我们应该要求依赖关系,而不是自己定义它们。
我们要求构造函数中的强制依赖项和setter中的可选依赖项。
将构造函数的签名更改为:
public Library(Map<Integer, IPatron> patrons) {
this.patrons = patrons;
}也使赞助人场决赛。
在这种情况下,Library类并不关心用户是如何创建的以及它是什么。因为这不是它的责任。
您现在不需要任何间谍或模拟来测试库类。而且它更易于扩展和测试。
https://stackoverflow.com/questions/57870719
复制相似问题