java - Spring Boot中的Mockito不模拟对象

标签 java unit-testing spring-boot mockito

我有一个简单的测试用例,我在 Spring Boot 应用程序中使用 Mockito。

userOperation.java

...
@Autowired
Validator nameValidator;

private boolean userOperation(String name) {
    NameStats nameStats = nameValidator.validate(name);
    if (!nameStats.isSuccess()) {
        throw new Exception();
    }
    return true;
}
...

Validator.java

public NameStats validate(String name)
{
    NameStats nameStats = new NameStats();
    // code goes here
    return nameStats;
}

testCase.java

...
@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportFileOperationTest {

    @Mock
    Validator nameValidator;

    @Mock
    NameStats nameStats;

    @InjectMocks
    UserOperation operation;

    @Test
    public void  ConnectorDelegate0Test() {
        Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
        Mockito.when(nameStats.isSuccess()).thenReturn(true);
        operation.userOperation(restConsumerRequest);
    }

}
...

错误:

对于上述测试用例,我收到 NullPointerException。 在跟踪时我发现测试中的以下代码行返回空值。

Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);

由于 null 值,当它尝试调用 nameStats.isSuccess() 时,它会抛出 nullpointException,即使我已将此函数的响应模拟为 true

问题: 1. 我是否以正确的方式 mock 了回应? 2.为什么mock函数返回null对象?

更新:

testCase.java

@SpringBootTest
@RunWith(SpringRunner.class)
public class ImportFileOperationTest {

    @MockBean
    Validator nameValidator;

    NameStats nameStats;

    @InjectMocks
    @Resource
    UserOperation operation;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void  ConnectorDelegate0Test() {
        nameStats = new nameStats();
        Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
        Mockito.when(nameStats.isSuccess()).thenReturn(true);
        operation.userOperation(restConsumerRequest);
    }

}

我尝试手动创建对象 nameStats 并期望 validate 函数返回该对象,但它仍然返回 null

如有任何帮助,我们将不胜感激。

最佳答案

测试应由 Mockito 驱动或 Spring 驱动。 Spring 驱动将具有 @SpringBootTest@RunWith(SpringRunner.class) 类级注释,并且模拟将使用 @MockBean 或显式声明使用 Mockito.initMocks 实例化。 Mockito 驱动的测试将具有 @RunWith(MockitoJUnitRunner.class),并且模拟将使用 @Mock 声明和/或使用 @InjectMocks 注入(inject)。请注意,当在方法中使用 new 实例化 NameStats 等实例时,注入(inject)没有帮助。

显示的测试不必是@SpringBootTest,因此可以将其编写为 Mockito 驱动的测试,如下所示:

@RunWith(MockitoJUnitRunner.class)
public class ImportFileOperationTest {

@Mock
Validator nameValidator;

@InjectMocks
UserOperation operation;

@Test
public void  connectorDelegateTest() {
    NameStats nameStats = new NameStats();
    nameStats.setStats(Stats.SUCCESS);
    Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);

    operation.userOperation(restConsumerRequest);
}

关于java - Spring Boot中的Mockito不模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56958187/

相关文章:

Java 8 Comparator nullsFirst naturalOrder 混淆

java - 同一 Activity 中的两个 DatePicker - Android

ruby - `block in non_options' : file not found: (ArgumentError)

java - 无法使用 ***Spring Boot*** 解析名称为 'homePage' 的 servlet 中名称为 'dispatcherServlet' 的 View

java - Docker/Marathon 上的 Spring Boot 数组环境变量

java - OpenGL GlOrtho 没有出现图元

java - 应用程序错误 : ClassNotFoundException - TTT. jar - Java Applet

unit-testing - 保存Associates Cakephp时如何测试添加

ios - Swift XCTest 访问私有(private)变量

spring-boot - Mockito MockedStatic when() "Cannot resolve method"