构造函数测试类中的Null模拟,带有来自Mockito-junit-jupiter的MockitoExtension

时间:2018-08-02 16:21:53

标签: java mockito junit5

通过使用EXAMPLE 2中的@MockitoExtension扩展名,模拟在测试类构造函数中为null。

使用的依赖项:

mockito-junit-jupiter:2.18.0
unit-jupiter-api:5.1.1

我们只能通过一个模拟字段来重现该问题,但是测试构造函数下的对象对模拟的使用很好地说明了典型情况:

mockito-junit-jupiter

结果,模拟对象四处走动,但未与测试中的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()); // ... } } 对象相关联。
为什么呢有什么解决方法?

1 个答案:

答案 0 :(得分:3)

解决方案1:

通过Foo代替构造函数初始化:

@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()); // ... } } 也是一个品味问题,因为 如果所有注入策略均失败,则Mockito将不会报告失败。
不需要注射可能会惹恼您。如果是这样,您可以使用下一种方法。

解决方案2:

通过带有@InjectMocks注释的方法替换构造函数初始化:

@BeforeEach