当前位置: 首页 > 知识库问答 >
问题:

将模拟对象注入到在测试中声明为字段的待测试对象中使用mockito不起作用?

巴帅
2023-03-14

我有一个类,我正在为我的服务注入一个代理。

Service service
{
    private ServiceProxy proxy;
    public Service(ServiceProxy proxy)
    {
        this.proxy = proxy; 
    }
}
ServiceTest
{
    @Mock
    ServiceProxy mockProxy;
    Service service = new Service(mockProxy);
}

共有1个答案

糜运良
2023-03-14

如果您使用的是Mockito版本1.9.0或更高版本,那么实现所需目标的最佳方法如下所示:

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {

    @Mock
    private ServiceProxy proxy;

    @InjectMocks
    private Service service;

    @Test
    public void test() {
        assertNotNull(service);
        assertNotNull(proxy);
    }
}

首先是@runwith(MockitoJUnitRunner.class)声明,它将导致@mock和@injectMocks注释自动工作,而不需要任何显式初始化。第二件事是,从Mockito1.9.0开始,@InjectMocks注释可以使用构造函数注入机制,这是服务类的最佳选择。

@InjectMocks的其他选项是Setter注入和Field注入(请参见文档),但您需要一个no argument构造函数来使用它们。

  • 您没有使用MockitoJUnitRunner或mockitoAnnotations.initmocks(this),因此@mock annotation不起作用
  • 即使满足上述要求,您的示例也会失败,因为mockProxy将在构建测试之后初始化,并且在构建测试类期间尝试初始化您的服务,因此它会收到空的mockProxy引用。

如果由于某种原因您不想使用@InjectMocks,唯一的方法是在测试方法体中或在@Before注释的setUp方法中构造您的服务对象。

 类似资料:
  • 请考虑以下代码: 此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。 我是通过Guice进行依赖注入的新手,不知道为什么我不能以这种方式模拟实现对象?

  • 我有一个Spring Boot应用程序和服务,里面有私有的道场。私有DAO属性使用进行注释(没有设置器或构造器设置它,只有注释)。我试图为服务编写Spock测试,但找不到如何将模拟DAO注入变量。

  • 问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测

  • 我有一个带有的测试类,它用于初始化Mockito: 现在我有一个@autowired field来获得方面的建议,但不能注入模拟。

  • 当使用mockito单元测试Spring mvc控制器时,如何注入道层对象。当使用SpringJUnit4ClassRunner类时,它总是使用@Spy注释给空指针异常。 示例代码: 在这个测试用例中,依次调用,它总是返回