Dev*_*per 5 java unit-testing mockito spring-boot
我有一个简单的测试用例,我在 Spring Boot 应用程序中使用 Mockito。
用户操作.java
...
@Autowired
Validator nameValidator;
private boolean userOperation(String name) {
NameStats nameStats = nameValidator.validate(name);
if (!nameStats.isSuccess()) {
throw new Exception();
}
return true;
}
...
Run Code Online (Sandbox Code Playgroud)
验证器.java
public NameStats validate(String name)
{
NameStats nameStats = new NameStats();
// code goes here
return nameStats;
}
Run Code Online (Sandbox Code Playgroud)
测试用例.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);
}
}
...
Run Code Online (Sandbox Code Playgroud)
错误 :
对于上述测试用例,我收到 NullPointerException。在跟踪时,我发现测试中的以下代码行返回空值。
Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
Run Code Online (Sandbox Code Playgroud)
由于 null 值,当它尝试调用它时nameStats.isSuccess(),它会抛出 nullpointException,即使我已将此函数的响应模拟为true.
问题:1.我是否以正确的方式嘲笑了回应?2.为什么mock函数返回null对象?
更新 :
测试用例.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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试手动创建对象nameStats并期望validate函数返回该对象,但它仍然返回null。
任何帮助,将不胜感激。
Mic*_*hal 10
测试应由 Mockito 驱动或 Spring 驱动。Spring 驱动将具有@SpringBootTest类@RunWith(SpringRunner.class)级注释和模拟,将使用 来声明@MockBean或显式实例化Mockito.initMocks。Mockito 驱动的测试将使用 来@RunWith(MockitoJUnitRunner.class)声明@Mock和/或注入模拟@InjectMocks。请注意,当实例在方法内NameStats实例化时,注入没有帮助。new
显示的测试不一定如此@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);
}
Run Code Online (Sandbox Code Playgroud)
您需要用于@InjectMocks所有类类型,并且@Mock需要用于该类内的所有关联属性。
例子 :
class Product {
ProductDetails productDetails;
}
class ProductDetails {
}
Run Code Online (Sandbox Code Playgroud)
上述类的示例测试用例:
@SpringBootTest
@RunWith(SpringRunner.class)
public class ProductTest {
@Mock
ProductDetails productDetails;
@InjectMocks
Product product;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13692 次 |
| 最近记录: |