微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在另一个方法中为方法调用编写 Junit?

如何解决如何在另一个方法中为方法调用编写 Junit?

public class Account{

    public String getAcctNo(int accno){
        String cardno = getcreditCard();
        return accno + ":" + cardno;
    }

    public String creditCard(){
        Random rand = new Random();

        int one = rand.nextInt(1000);
        int two = rand.nextInt(1000);
        int three = rand.nextInt(1000);
        int four = rand.nextInt(1000);

        return one + "-" + two + "-" + three + "-" + four;
    }
}   

我正在编写如下的单元测试,但我认为我们应该针对这种情况编写不带模拟的代码

public class AccountDetailsTestCase {

    @Test
    public void testAccountNo() {
        Account account = mock(Account.class);

        when(account.creditCard()).thenReturn("101-102-103-104");

        assertEquals(account.creditCard(),"101-102-103-104");

        when(account.getAcctNo(10110)).thenReturn("10110:101-102-103-104");

        String expected = "10110:101-102-103-104";
        String result = account.getAcctNo(10110);

        assertEquals(expected,result);
    }
}

您能否建议我们如何为上述场景编写单元测试。我需要帮助为 getAcctNo 方法中的方法调用 creditCard 编写 JUnit。注意:上面的代码只是一个场景,所以请告诉我如何为方法内部的方法调用编写 JUnit。

解决方法

目前您的测试不测试您的逻辑的一行。

when(account.creditCard()).thenReturn("101-102-103-104");
assertEquals(account.creditCard(),"101-102-103-104");

在这里,您基本上只是在测试您的模拟作品。
测试的这一部分也是如此。

when(account.getAcctNo(10110)).thenReturn("10110:101-102-103-104");
String expected = "10110:101-102-103-104";
String result = account.getAcctNo(10110);
assertEquals(expected,result);

在测试时,您应该问问自己代码的可见行为是什么?那就是你想要测试的东西。在您的情况下,我想这将是此处的字符串连接:

return accno + ":" + cardno;

这是不应该被嘲笑的部分,因为它是你想要测试的东西。


我看到的另一个问题是类设计本身。 accno(我猜是accountNumber?)和cardno(cardNumber?)是您的Account 的属性,应该存储在成员变量中。 如果您将 Account 更改为此设计,测试您的逻辑将变得相当容易:

public class Account {

    private String accno;
    private String cardno;

    public Account(String accno,String cardno) {
        this.accno = accno;
        this.cardno = cardno;
    }

    public String getAcctNo() {
        return accno + ":" + cardno;
    }
    
    // getter and setter for accno and cardno
}

现在你可以简单地通过构造函数传递有关Account的信息并测试::getAcctNo()的逻辑

@Test
public void testAccountNo() {
    
    Account account = new Account("10110","101-102-103-104");
    String acctNo = account.getAcctNo();
    
    assertEquals("10110:101-102-103-104",acctNo);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。