首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将间谍对象注入私有字段

如何将间谍对象注入私有字段
EN

Stack Overflow用户
提问于 2019-09-10 12:22:29
回答 2查看 698关注 0票数 0

我正试图把一个间谍注入私人领域的private Map<Integer, IPatron> patrons;没有运气。该字段不属于任何构造函数,也不具有任何setter或getter。如果可能的话,我试图避免修改源代码。

我可以显式分配间谍,如果该领域设置为公开,但据我所知,它应该自动发生。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-10 12:29:24

首先,您对Library类进行了正确的测试,所以它不是间谍或任何东西,它只是一个常规实例,因此您应该在测试中创建它,如下所示:

代码语言:javascript
复制
 Library underTest = new Library(...);

现在,您的问题的答案不是关于Mockito,而是关于使代码单元可测试的问题。

没有任何生成的代码是自动单元可测试的。

正如现在编写的类Library一样,这是不可能的(除非您强行设置用户的反射)。反思也不是这样做的好方法。

我建议使用依赖注入原则并重构如下代码:

代码语言:javascript
复制
class Library {
   private Map<Integer, IPatron> patrons;

   public Library(Map<Integer, IPatron> patrons) {
        this.patrons = patrons;
   }
}

然后,在测试中,您可以创建patrons作为一个映射,作为一个间谍,模拟或任何您想要模拟真实的交互,并注入到Library

代码语言:javascript
复制
Library underTest = new Library(patrons);
票数 1
EN

Stack Overflow用户

发布于 2019-09-10 12:29:26

库类中的硬代码赞助者依赖项。不要使用硬编码。

我们应该要求依赖关系,而不是自己定义它们。

我们要求构造函数中的强制依赖项和setter中的可选依赖项。

将构造函数的签名更改为:

代码语言:javascript
复制
public Library(Map<Integer, IPatron> patrons) {
    this.patrons = patrons;
}

也使赞助人场决赛。

在这种情况下,Library类并不关心用户是如何创建的以及它是什么。因为这不是它的责任。

您现在不需要任何间谍或模拟来测试库类。而且它更易于扩展和测试。

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

https://stackoverflow.com/questions/57870719

复制
相关文章

相似问题

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