首页 > 解决方案 > 如何在 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

}

标签: javamockitojunit4

解决方案


你不应该在这里使用断言。使用 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");

}

推荐阅读