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

构造函数测试类中的空mock,使用来自mockito-junit-jupiter的MockitoExent

卫梓
2023-03-14

通过使用mockito junit jupiter中的@MockitoExtension扩展,mock在测试类构造函数中为null。

使用的依赖项:

mockito junit jupiter:2.18.0
单位jupiter api:5.1.1

我们可以只用一个模拟字段来重现这个问题,但测试构造函数下的对象使用模拟很好地说明了典型的场景:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {

    @Mock
    Bar mockBar;
    Foo foo;

    public FooTest() {
        foo = new Foo(mockBar); // mockBar is null here
    }

    @Test
    public void doThis() {
        Mockito.when(mockBar.doThat())
               .thenReturn(Mockito.anyInt());
        // ...
    }

}

因此,模拟对象正在四处走动,但与正在测试的Foo对象没有关联。
为什么?使用什么变通方法?

共有1个答案

岳玉书
2023-03-14

解决方案1:

将构造函数初始化替换为@InjectMocks

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {

    @Mock
    Bar mockBar;

    @InjectMocks
    Foo foo;    

    @Test
    public void doThis() {
        Mockito.when(mockBar.doThat())
               .thenReturn(Mockito.anyInt());
        // ...
    }

}

这是可行的,但是使用@InjectMocks也是一个品味问题,因为如果所有注入策略都失败了,Mockito就不会报告失败
这种不需要的注射可能会使您烦恼。如果是这样,您可以使用下一种方法。

解决方案2:

将构造函数初始化替换为一个注释为@Beforeeach的方法:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class FooTest {

    @Mock
    Bar mockBar;
    Foo foo;

    @BeforeEach
    public void beforEach() {
        foo = new Foo(mockBar); 
    }

    @Test
    public void doThis() {
        Mockito.when(mockBar.doThat())
               .thenReturn(Mockito.anyInt());
        // ...
    }

}
 类似资料:
  • 我对junit mockito非常陌生,并尝试使用mockito编写junit测试用例。 这是我的方法,我必须为此编写一个jUnit。 ChefService和ChefApi传递的方法参数来自第三方api 这里是呼叫chefService。listCookbookVersions()将返回CookBookVersion类类型的迭代器,如

  • 我想对签名为的方法进行单元测试 连接对象使用 并在测试时传递给methodA。 神谕sql。数组有一个构造函数 methodA具有获取ArrayDescriptor的逻辑。它还具有为该构造函数提供第三个参数的逻辑,但它将其作为对象数组提供 我模拟这两组逻辑,并传递一个模拟的ArrayDescriptor对象和一个模拟的对象数组。所有这些模仿都是正确的。 所以我的构造函数调用就像 当作为测试的一部分

  • 我试图定义一个,如示例MockitoExtension所提供的,但无法成功地使用参数化的类实例。 期待着关于如何用在中实现接口的类的参数化实例测试接口的建议。

  • 我有这两种方法,在使用Mock实现测试时遇到了困难。我该如何参加考试? 我有麻烦得到Jboss目录而不必启动System.get属性(jboss.server.temp.dir);

  • 伙计们,我是JUnit测试的新手,并试图很好地掌握它,现在我正在为一个构造函数(用于创建有向图的有向图类)编写JUnit测试,该构造函数在读取负int值时抛出IllegalArgumentExctive,如果一切正常(节点值的数量)大于零,则创建一个图。 有向图类: 下面是我试图写的测试: 我应该如何使用一个(或两个)测试用例来测试这两个用例?如果“in”没有检测到-ve值,我就得到java。否则

  • 下面是这个问题:我被要求从哪里开始一个新问题。 问题是我对JUnit了解不够,或者对等的了解不够,无法以Jeff Bowman提到的方式解决这个问题。