【问题标题】:How to write test cases for the following method that holds the local object return by the database?如何为以下保存数据库返回的本地对象的方法编写测试用例?
【发布时间】:2017-02-07 04:16:07
【问题描述】:

目前,我正在使用 TestNG 并尝试为 操作元数据()方法。在该方法中,元数据由存储库提供。然后根据给定的联系人列表更新元数据。

我在编写操作 MetaData() 方法的测试用例时卡住了。

public class MetaData {

    String email;
    Map<String, Integer> count = new HashMap<>();

    public void setEmail(String email) {
        this.email = email;
    }

    public void updateCount(List<String> contact) {
        // perform the calculation and update the count.
    }
}

public class MetaDataHandler {

    @Autowired
    MetaDataRepository metaDataRepository;

    public MetaData manipulateMetaData(String emailAddress, List<String> contact) {
        MetaData metaData = metaDataRepository.findOneByEmail(emailAddress);

        if (metaData == null) {
            metaData = new MetaData();
            metaData.setEmail(emailAddress);
        }

        metaData.updateCount(contact);

        return metaData;
    }
}

测试用例

@Mock
MetaDataRepository metaDataReporitory;

@InjectMocks
MetaDataHandler metaDataHandler = new MetaDataHandler();

@BeforeMethod
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testManipulateMetaData() {
    List<String> contact = new ArrayList<>();

    String emailAddress = "someone@gmail.com";

    Mockito.when(metaDataReporitory.findOneByEmail(emailAddress)).thenReturn(null);
   //Stuck Here
   //Want to test manipulateMetaData() method
}

【问题讨论】:

  • 这段代码看起来不对metaData.updateCount(List&lt;String&gt; contact);应该是metaData.updateCount(contact);
  • 谢谢。现在我更正了这个问题。
  • 你卡在哪里了?您正在寻找什么?
  • 我首先模拟 metaDataRepository 以返回 null 值。然后从测试方法中调用操作MetaData() 方法。之后我不知道该怎么办?
  • 请出示你的测试课

标签: java testing mockito testng powermockito


【解决方案1】:

!!

如果是,你是否也在使用 maven,那么你应该在 prom.xml 中提供依赖项

您必须在制作测试用例时传递电子邮件地址和自定义列表,并在编写 jUnit 测试用例时将该值传递给函数。

String email="xyz@yahoo.com"; //your email custom here you can take value from scanner also just declare the scanner object and take value from user .
List<String> contact  = new LinkedList<String>; //declaration of linklist 

//now write code here to take some value from the user (like we normally take some value and insert it into the list )
//once list value is inserted do ...

Metadata meta_test = null ; // take obj of metadata as you have made a return type 

meta_test= manipulateMetaData(email, contact); //call that function 

//if return we get is null that means nothing is inserted in meta_test and it must show red while testing and if not null that means test case is successful :)

 if(meta_test != null)
 {
    asserttrue(true);
 }
 else
 {
   assertrue(false);
 }

//希望,我解决了你的问题,我可能在某些地方没有具体的术语 od 语法..srry :)

【讨论】:

  • 如何处理 metaData.updateCount(contact); ?在编写测试用例时。
  • 也可以制作相同功能的测试用例:)也尽量不要制作void类型的功能。使该函数的返回类型主要是 Boolean ,并检查返回类型是否为 true 。您可以像上面的评论一样在另一个类中制作测试用例:)
【解决方案2】:

在单元测试中,您可以测试代码单元的行为。在这里,我假设您正在编写一个测试用例来检查 manipulateMetaData()metaDataReporitory.findOneByEmail(emailAddress) 返回 null 时的行为,并且您希望 manipulateMetaData() 将创建一个包含电子邮件地址和 updateCount 的新记录。

到目前为止,您已经成功模拟了metaDataReporitory.findOneByEmail(emailAddress)。下一步应该是:

  • 调用操作MetaData() 例如。 Metadata metadata= metaDataHandler.manipulateMetaData(emailAddress ,contacts);
  • 现在检查操作 MetaData() 实际做了什么,断言一些 检查:

    assertEquals(metadata.getEmail(), emailAddress);

  • 您还可以验证对模拟对象的调用:

    验证(模拟,atLeastOnce()).metaDataReporitory.findOneByEmail(emailAddress);

更多测试场景见this

【讨论】:

    【解决方案3】:

    Mockito.when(new MetaData().thenReturn("你的模拟对象")));

    这对你有帮助,请谷歌更多

    【讨论】:

    • 基本上我不知道如何处理 metaData.updateCount(contact);在为该方法编写测试用例时。
    • 嘿 .. metaData.updateCount(linklist 联系人)
    • updateCount() 更改元数据的内部状态。但正如你所见,它没有返回任何东西。
    • 如何执行 Mockito.when(metaData.updateCount(contact);).thenReturn(1);来自测试方法。
    • 用powermockito可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2018-08-26
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多