java - 如何在 void 方法内更新后断言对象值 - Junit
问题描述
我想断言 SalsGroupId 中的值在MyObject
调用initMyObj
.
当我模拟时,MyObject
我无法断言更改的值,因为它返回相同的模拟值。我知道这是 Mockito 的行为。但是如何测试呢?
@Component( "mybean" )
@org.springframework.context.annotation.Scope( value="session" )
public class MyBean {
@Autowired
private MyObject myObj;
public void initMyObj(String SalsGroupId){
if (!SalsGroupId.equals(myObj.getSalsGroupId())) {
getMyObj().setSalsGroupId(SalsGroupId); // update the SalsGroupId
getMyObj().setMyString("My STRING"); // initially this is null
}
}
public MyObject getMyObj(){
return myObj;
}
}
===== 在 Junit 测试中。
@InjectMocks
private MyBean myBean;
@Mock
private MyObject myObj;
@Test
public void initInitMyObject() {
when(myBean.getMyObj().getSalsGroupId()).thenReturn("SOME_STRING");
myBean.initMyObj("OTHER");
assertEquals("OTHER",myBean.getMyObj().getSalsGroupId()); // but the value is still "SOME_STRING"
assertEquals("My STRING",myBean.getMyObj().getMyString()); // but the value is null
}
解决方案
你不应该在这里使用断言。使用 Mockito.verify() 确保使用正确的参数调用 .setSalsGroupId() 和 .setMyString() 方法:
@Test
public void initInitMyObject() {
when(myBean.getMyObj().getSalsGroupId()).thenReturn("SOME_STRING");
myBean.initMyObj("OTHER");
verify(myBean.getMyObj()).setSalsGroupId(<expected value>);
verify(myBean.getMyObj()).setMyString("My STRING");
}
推荐阅读
- ios - 在 Flutter iOS 中启动 Google Native Ads 时引发 AdvertierView 错误
- mysql - 无法根据另一个表的信息更新一个表
- python - (Discord.py) 加载 cogs 并打印它们的状态
- python - Pytesseract:白名单剂量正常工作
- php - 根据 ID 循环遍历数据库内容
- javascript - 我可以在简单的 JS 平均应用程序中使用 TS 类/接口吗?
- kotlin - 如何将 lambda 链接到 Kotlin 中的结果 lambda?
- android - Android Google Maps:使用 ClusterManager 和 ClusterRenderer 时,如何检测或提醒某个项目不再显示?
- docker - 从 bash 脚本运行时,集成测试卡在启动时
- weka - 为什么我的 weka 没有按班级显示详细的准确性