【发布时间】:2019-11-19 08:12:42
【问题描述】:
我有一个简单的测试用例,我在 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。 在跟踪时,我发现 test 中的以下代码行返回 null 值。
Mockito.when(nameValidator.validate(any(String.class))).thenReturn(nameStats);
由于 null 值,当它尝试调用 nameStats.isSuccess() 时,它会抛出 nullpointexception,即使我已将此函数的响应模拟为 true。
问题: 1. 我是否以正确的方式嘲笑回应? 2. mocking函数为什么返回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。
任何帮助将不胜感激。
【问题讨论】:
-
您可以尝试在您的设置中注释掉 MockitoAnnotations 调用吗?您根本不需要做任何事情,Spring 会完成这项工作。
-
另外,既然你
@InjectMocks,就没有(明显的)需要@MockBean。你能试着用@Mock替换@MockBean吗? -
@MockBean需要使用。@InjectMocks不起作用 - 您需要正确配置 Spring 自动装配。 -
1.使用构造函数注入。停止自动装配字段,您不需要这样做。 2.如果不需要,不要使用spring来测试你的类。 3. 手动初始化类并将你的模拟提供给 id。注入模拟不是 IoC/DI 框架,并且有很大的陷阱。如果你这样做,你可以用一种简单易懂的方式测试你的 java 类。如果你确实需要模拟一个 spring bean,请阅读 `@MockBean'
-
如果你想模拟,你应该使用
RunWith(MockitoRunner.class),而不是SpringRunner。
标签: java unit-testing spring-boot mockito