Spring 启动测试@Mock 注释不创建模拟对象

Spring Boot test @Mock annotation doesn't create mock object

我正在使用 Spring Boot 2.1 和 JUnit 5,并且刚刚创建了一个这样的测试:

@RunWith(MockitoJUnitRunner.class)
class UserServiceImplTest {

    @Mock
    private AppProperties appProperties;
    @Mock
    private UserAccountService userAccountService;

    @BeforeEach
    void setMockOutput() {
        when(appProperties.getPort()).thenReturn("8088");
        ...
    }


    ...

}

问题是 setMockOutput 方法中的两个变量都为空,即使在 class 上使用了 @RunWith(MockitoJUnitRunner.class) 注释,如其他 SO 问题所述。

如果我像下面的代码那样手动创建模拟,那么它工作正常:

@RunWith(MockitoJUnitRunner.class)
class UserServiceImplTest {

    private AppProperties appProperties;
    private UserAccountService userAccountService;

    @BeforeEach
    void setMockOutput() {
        appProperties = Mockito.mock(AppProperties.class);
        userAccountService = Mockito.mock(UserAccountService.class);

        when(appProperties.getPort()).thenReturn("8088");
        ...
    }


    ...

}

MockitoJUnitRunner 与 JUnit 5 不兼容。 您需要使用 @ExtendWith(MockitoExtension.class) 而不是它。 此 class 位于依赖项中:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

在 JUnit 5 中使用 Mockito 注释需要调用 MockitoAnnotations.initMocks(this);在测试方法运行之前。尝试将它添加到 @BeforeEach 方法中,然后看看它是否有效。有关 MockitoAnnotations 的更多信息:https://static.javadoc.io/org.mockito/mockito-core/2.2.28/org/mockito/MockitoAnnotations.html