通过使用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());
// ...
}
}
对象相关联。
为什么呢有什么解决方法?
答案 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