通过使用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:
将构造函数初始化替换为@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提到的方式解决这个问题。