我有一个简单的测试用例,我在 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/