【问题标题】:How to assert object values after update inside a void method - Junit如何在 void 方法内更新后断言对象值 - Junit
【发布时间】:2019-10-08 09:43:32
【问题描述】:

我想断言 MyObject 中 SalsGroupId 的值在调用 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

}

【问题讨论】:

  • 您是否调试过您的代码,以确保您确实调用了 setter?
  • @Stultuske 是的,MyObj 不为空。但它的属性是空的。 initMyObj() 之前和之后
  • 我没有问 myObj 是否为空。您是否真的验证过 !SalsGroupId.equals(myObj.getSalsGroupId()) 返回 true?您是否检查过该 if 块中的代码是否已执行?
  • @Stultuske 是的。它进入 if 条件。方法没有错误。是的,我确实调试过它。
  • 你永远不应该模拟数据对象!只需构造一个实例并使用它。那么事情就会变得更有意义!

标签: java mockito junit4


【解决方案1】:

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

}

【讨论】:

  • 是的。这行得通。但这是我应该为这种情况编写测试的方式吗?还是有另一种方法来验证对象值是什么?只是对其他选择感到好奇。
  • @abinet 您只是在更改已测试的内容。如果您想知道该对象是否确实是它已更改的内容,是的,您需要一个断言
  • @Stultuske 但是如何断言呢?有什么办法吗?
  • @everalian 正是你这样做的方式。我认为你的模拟是错误的。你模拟: myBean.getMyObject().getSalsgroupId() 但你从不执行它,你执行 myObject.getSalsgroupId();
  • @Stultuske 的模拟是去传递值去通过if条件。不使用 myBean.getMyObject().getSalsgroupId() 是什么意思?我在最初的问题中更新了模拟对象的详细信息。
猜你喜欢
  • 2020-05-13
  • 1970-01-01
  • 2013-08-01
  • 2019-11-02
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多